你的浏览器不支持canvas

Love You Ten Thousand Years

Node的特点

Date: Author: M/J

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。转载请注明来自小可嗒嗒的博客

异步 I/O

Node中,绝大多数的操作都是以异步的方式进行调用。 这样的意义在于:在Node中,我们可以从语言层面很自然地进行并行I/O操作。

每个调用之间无须等待之前的I/O调用结束,极大提高了效率。

举例:

var fs = require('fs');

fs.readFile('/path', function (err, file){
    console.log ('Well Done!')
});
console.log('Calling for file!');

"Well Done!"是在"Calling for file!"之后输入的。


事件与回调函数

无论在前端后端,事件都是常用的。

var http = require('http');
var querystring = require('querystring');

//侦听服务器的request事件
http.createServer(function(req, res){
    var postData = '';
    req.setEncoding('utf8');

    //侦听请求的data事件
    req.on('data', function (trunk){
        postData += trunk;
    });

    //侦听请求的end事件
    req.on('end', function(){
        res.end(postData);
    });
}).listen(8080);
console.log('服务器启动完成!')

Node创建了一个Web服务器,并侦听8080端口。对于服务器,为其绑定了request事件,对于请求对象,我们为其绑定了data事件和end事件。

相应地,我们在前端为Ajax请求绑定了success事件,在发出请求后,只需关心请求成功时执行相应的业务逻辑即可。

$.ajax({
    'url': '/url',
    'method': 'POST',
    'data': {},
    'success': function (data){
        // success事件
    } 
});

除了事件外,回调函数也无处不在。但是,回调函数也是最好的接收异步调用返回数据的方式。

单线程

Node中,javascript与其余线程是无法共享任何状态的。

单线程的最好好处是不用像多线程那样要在意状态的同步问题,没有死锁的存在,也没有线程上下文交换所带来的性能上的开销

缺点也是有的:

  • 无法利用多核CPU
  • 错误会引起整个应用的退出,健壮性问题
  • 大量计算占用CPU导致无法继续调用异步I/O

Node采用子进程来解决单线程中大计算量的问题: chile_process

朴灵. 深入浅出Node.js[M]. 人民邮电出版社, 2013.


对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。