一、从一个简朴的案例最先
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);
});//基础的运用