如何在async.waterfall中的promise()。then()内部调用cb()

时间:2018-08-21 09:59:50

标签: javascript node.js promise async.js waterfall

在调用。然后

时,如何在promise中的async.waterfall中调用cb()

请查看下面的代码

async.waterfall([
    function check_network(cb) {

        cb("ERROR-25", "foo")   //<<----- This works
    },    
    function process_pay(cb){    
        somePromise().then((status)=>{
            if(status){
                cb(null, status)  //<<----ERROR---- can't call cb() it looses the scope
            }
            cb("ERROR-26")  //<<--ERROR------ Same issse as above
        })
    },
    function print(cb){
        //some code
    } ])

1 个答案:

答案 0 :(得分:3)

在Waterfall Function中:结果值作为参数依次传递给下一个任务。

回调中的第一个参数也保留给Error。因此,当执行此行

cb("ERROR-25")

这意味着抛出错误。因此将不会调用下一个函数。

现在出现的问题是“无法调用cb()会松开范围” 。如果 check_network cb的调用方式如下

cb(null, "value1");

process_pay 的相应定义应如下:

function process_pay(argument1, cb){    
    somePromise().then((status)=>{
        if(status){
            cb(null, status)
        }
        cb("ERROR-26")
    })
}

此处参数1将为'value1'

最终代码应类似于

async.waterfall([
    function check_network(cb) {
        // if error
        cb("ERROR-25") // Handled at the end
        // else
        cb(null, "value1") // Will go to next funtion of waterfall
    },    
    function process_pay(arg1, cb){    
        somePromise().then((status)=>{
            if(status){
                cb(null, status)  // cb will work here
            }
            cb("ERROR-26")  // Error Handled at the end
        })
    },
    function print(arg1, cb){
        //some code
    } 
], function(error, result){
    // Handle Error here
})

有关异步瀑布的更多信息,请访问此link