假设我想发送一封电子邮件然后更新数据库,这两个操作都是异步的。这就是我通常的写法。
send_email(function(err, id){
if(err){
console.log("error");
}else{
update_database(id,function(err, id){
if(err){
console.log("error");
}else{
console.log("success");
}
});
}
});
我想用中间件代替。
var mid = {};
mid.send_email = function(){
return function(next){
send_email(function(err,id){
if(err){
console.log("error");
}else{
next(id);
}
});
}
}
mid.update_database = function(){
return function(id,next){
update_database(id,function(err,id){
if(err){
console.log("error");
}else{
next(id);
}
});
}
}
mid.success = function(){
return function(id,next){
console.log("success")
next(id);
}
}
堆叠中间件。
middleware.use(mid.send_email());
middleware.use(mid.update_database());
middleware.use(mid.success());
手头有两个主要问题。
- 如何使用中间件代替嵌套回调?
- 是否可以将变量传递给
next()
?
最佳答案
您想要的是能够处理异步控制流。许多 js 库可以帮助您实现这一目标。您可以使用 waterfall
函数尝试使用 Async
库,因为您希望能够将变量传递给将要执行的下一个函数:
https://github.com/caolan/async#waterfall
“依次运行一组函数,每个函数将其结果传递给数组中的下一个。但是,如果任何函数将错误传递给回调,则不会执行下一个函数并立即调用主回调有错误。”
示例:
async.waterfall([
function(callback){
callback(null, 'one', 'two');
},
function(arg1, arg2, callback){
callback(null, 'three');
},
function(arg1, callback){
// arg1 now equals 'three'
callback(null, 'done');
}
], function (err, result) {
// result now equals 'done'
});
关于javascript - 我可以用什么来替换嵌套的异步回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14149925/