nodejs中的所有内容都是非阻塞的,这很好,但是如何在不使用大量嵌套回调列表的情况下创建必须一个接一个的函数all?
答案 0 :(得分:12)
你没有必须嵌套你的回调。
编写异步代码时有很多模式。
例如,这种matrioska-nested-style ......
database.find('foo', function (err, data) {
database.update('foo', 'bar', function (err, data) {
database.delete('bar', function (err, data) {
console.log(data);
});
});
});
...可以用更干净(但更详细)的方式重写:
var onDelete = function (err, data) {
console.log(data);
},
onUpdate = function (err, data) {
database.delete('bar', onDelete);
},
onFind = function (err, data) {
database.update('foo', 'bar', onUpdate);
};
database.find('foo', onFind);
另一种选择是使用模块来抽象回调的串行和并行执行。
答案 1 :(得分:8)
答案 2 :(得分:3)
您真正想要做的是找出您的操作阻止的原因并重新编码它们以使它们无阻塞。删除彼此的依赖关系。您需要改变您考虑非阻塞IO的方式。
使用库允许您以同步阻塞方式运行此类型代码只是一个糟糕的拐杖。
学习如何在node.js中编写非阻塞代码会更好,因为这就是它的设计目的。
答案 3 :(得分:2)
async module是一个特别好的解决方案 - 使用它可以产生更清晰的异步代码,嵌套更浅。你可以通过以下方式获得:
npm install async --save
特别看看:
但是,所有async's control flow-specific methods对于避免巨大的嵌套回调列表都非常有帮助。
另外,如果它有用,here's a jsFiddle I put together在学习库时,包含一组示例,包括async.waterfall&另一个用于async.series(打开控制台以查看它正在做什么)。
答案 4 :(得分:1)
use ES6 async and await method's for writing blocking code
====================================================================
Ex:
async function fName(){
lat firstResult=await task1;
let secondResult= await task2
}
function task1(){
//write your logic and after finishing your task return result as a PROMISE
return new Promise((reslove,reject)=>{
// write logic hear after reslove(success) or reject(error)
})
}
function task2(){
//write your logic and after finishing your task return result as a PROMISE
return new Promise((reslove,reject)=>{
// write logic hear after reslove(success) or reject(error)
})
};