nodejs异步编程详解

一、从一个简朴的案例最先

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

nodejs 特点是单线程、异步、非壅塞,假如代码逻辑涉及到多个回调,就会涌现非常恐怖的代码,不利于后期的保护。

二、 nodejs为何会设想成异步编程?

异步编程是跟着ajax才火的,所以最熟习异步编程的就是前端工程师。但在其他编程言语中,异步并不多见,PHP从头至尾就是同步壅塞来实行的,这致使它在庞杂的收集运用中没法更好的并发。固然我们并非在批评PHP,毕竟PHP是世界上最好的言语。PHP代码设想成同步有利于程序员递次编写营业逻辑,这个有点是不能无视的。

js就是异步的,浏览器在实行js与UI衬着共用一个历程,假如js采纳同步编程,会非常影响用户体验。为何js不是多线程呢?起首建立线程和实行线程上下文切换的开支较大,其次多线程编程常常面对锁、状况同步等题目。js单线程的编写体式格局比较相符人按递次思索的体式格局,是主流的编程体式格局。然则单线程没法对硬件资本充足的应用,node应用单线程,阔别多线程、状况同步等题目,应用异步I/O,让单线程阔别壅塞,以更好的应用CPU。node供应来类似于前端的Web Workers子历程来高效应用CPU。node基于事宜轮回的实行形式,使得回调函数非常广泛,关于平常的非异步的回调函数,函数由我们自行挪用。

三、异步编程的难点

1.非常的处置惩罚

node一般会将非常作为回调函数的第一个实参传回,假如第一个参数为null,那末就申明异步挪用没有非常抛出。

2.回调函数嵌套过深

开首的案例展现来多层回调的嵌套,致使代码非常难明白,然则如今能够经由过程 Promise、Generators、async函数处理。
其他另有多线程编程、异步转同步等。

四、异步编程处理方案

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);
});//基础的运用

更新中

    原文作者:林小新
    原文地址: https://segmentfault.com/a/1190000009165913
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞