nodejs异步编程详解

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

fs.readdir(path.join(__dirname, './index.js'), (err, files) => {
    files.foreach((filename, index) => {
        fs.readFile((filename, 'utf-8', (err, file) => {
            ...
        }))
    })
})

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

2、 nodejs为何会设计成异步编程?

异步编程是随着ajax才火的,因此最熟悉异步编程的就是前端工程师。但在其余编程语言中,异步并很少见,PHP从头至尾就是同步阻塞来执行的,这致使它在复杂的网络应用中没法更好的并发。固然咱们并非在批判PHP,毕竟PHP是世界上最好的语言。PHP代码设计成同步有利于程序员顺序编写业务逻辑,这个有点是不能忽视的。node

js就是异步的,浏览器在执行js与UI渲染共用一个进程,若是js采用同步编程,会十分影响用户体验。为何js不是多线程呢?首先建立线程和执行线程上下文切换的开销较大,其次多线程编程常常面临锁、状态同步等问题。js单线程的编写方式比较符合人按顺序思考的方式,是主流的编程方式。可是单线程没法对硬件资源充分的利用,node利用单线程,远离多线程、状态同步等问题,利用异步I/O,让单线程远离阻塞,以更好的利用CPU。node提供来相似于前端的Web Workers子进程来高效利用CPU。node基于事件循环的执行模式,使得回调函数十分广泛,对于通常的非异步的回调函数,函数由咱们自行调用。程序员

3、异步编程的难点

1.异常的处理web

node一般会将异常做为回调函数的第一个实参传回,若是第一个参数为null,那么就说明异步调用没有异常抛出。ajax

2.回调函数嵌套过深编程

开头的案例展现来多层回调的嵌套,致使代码很是难理解,可是如今能够经过 Promise、Generators、async函数解决。
其余还有多线程编程、异步转同步等。浏览器

4、异步编程解决方案

1.Promise/Deferred模式网络

Promise/Deferred模式必定程度上缓解了嵌套回调的问题,Promise只会处在未完成、完成态、失败态中的一种,只会从未完成转化为完成态或者失败态,不能逆转。且完成态和失败态不能相互转化。前端工程师

Promise对象具有then方法,接受完成态、失败态的调用,只接受function对象,其他对象将被忽略。then方法继续返回Promise对象,以实现链式调用。多线程

function asyncFunction() {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            resolve('Async Hello world');
        }, 16);
    });
}

asyncFunction().then(function (value) {
    console.log(value);    // => 'Async Hello world'
}).catch(function (error) {
    console.log(error);
});//基本的使用

更新中

相关文章
相关标签/搜索