ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-05-29 19:21:06  阅读:274  来源: 互联网

标签:javascript asynchronous node-js middleware callback


可以说我想发送一封电子邮件然后更新数据库,这两个动作都是异步的.这就是我通常写它的方式.

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库可以帮助您实现这一目标.您可以尝试使用瀑布函数的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,asynchronous,node-js,middleware,callback
来源: https://codeday.me/bug/20190529/1180163.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有