nodejs异步编程详解

2017-04-23 19:41

一、从一个简单的案例开始

$get = (url, cb) => {
    var http = require('http');
    http.get(url, (res) => {
        var html = '';
        res.on('data', (data) => {
            html += 'data';
        });
        res.on('end', () => {
            cb && cb(html);
        });
    }).on('error', (e) => {
        console.log(e);
    });
}

nodejs 特点是单线程、异步、非阻塞,如果代码逻辑涉及到多个回调,就会出现非常可怕的代码,不利于后期的维护。

二、 nodejs为什么会设计成异步编程?

异步编程是随着ajax才火的,所以最熟悉异步编程的就是前端工程师。但在其他编程语言中,异步并不多见,PHP从头到尾就是同步阻塞来执行的,这导致它在复杂的网络应用中无法更好的并发。当然我们并不是在批判PHP,毕竟PHP是世界上最好的语言。PHP代码设计成同步有利于程序员顺序编写业务逻辑,这个有点是不能忽视的。

js就是异步的,浏览器在执行js与UI渲染共用一个进程,如果js采用同步编程,会十分影响用户体验。为什么js不是多线程呢?首先创建线程和执行线程上下文切换的开销较大,其次多线程编程经常面临锁、状态同步等问题。js单线程的编写方式比较符合人按顺序思考的方式,是主流的编程方式。但是单线程无法对硬件资源充分的利用,node利用单线程,远离多线程、状态同步等问题,利用异步I/O,让单线程远离阻塞,以更好的利用CPU。