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

How to call a cb() inside promise().then() in async.waterfall

如何在调用 时在 async.waterfall 中调用 cb() 中的 promise。然后

请看下面的代码

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
    } ])

在瀑布函数中:结果值按顺序作为参数传递给下一个任务。

回调中的第一个参数也是为错误保留的。所以当这一行被执行时

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