javascript - 我可以用什么来替换嵌套的异步回调?

标签 javascript node.js asynchronous callback middleware

假设我想发送一封电子邮件然后更新数据库,这两个操作都是异步的。这就是我通常的写法。

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/

相关文章:

JavaScript 返回未定义

node.js - MongoDB 私有(private)字段

javascript - Electron 。如何用新的浏览器窗口覆盖停靠面板?

javascript - 如何在 Grunt 任务中保持服务器监听运行?

javascript - 获取元素位置

javascript - 如何以编程方式调用移动设备上的 native 日期选择器

java - 为什么在vertx的Handlebars库中调用Synchronize?

javascript - 在 Nodejs 4.x 中从不同文件位置重用异步函数的有效方法是什么?

javascript - Istanbul 尔封面测试挂起,然后在 60 秒后中止

javascript - Sequelize.js - 关联,2 个表