async.js瀑布内未处理的Promise拒绝警告

时间:2017-09-04 19:37:17

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

我正在使用令人惊叹的async.js库进行项目。试图了解承诺的使用,但我不能。

我实现了以下代码:

function connect(){
    return new Promise(function (resolve, reject) {
        bar.getConnection( server, function( err, conn ){
            if( err ) {
                reject("An error. " + err);
            }
            else{
                resolve("Ok. Connected to: " + conn.serverAddress);
            }
        });
    });
}

然后在async waterfall

exports.getRequest = function( callbk ){
    (function(callback) {
        async.waterfall([
            function (next) {
                connect().then(function (result) {
                    console.log(result);
                    next();
                }).catch(function (e) {
                    // If something gets an error on the next function, this catch fires
                    // And the 'next(e)' does not execute
                    console.log("An error here");
                    next(e);
                });
            },
            function (next) {
                // do something .... and get a result
                // but if something gets an error here, fires the 'catch' on 'connect'
                next(null, result);

            },
            function (err, result) {
                if(err) {
                    callback(true, "" + err);
                }
                else {
                    callback(false, result);
                }
            }
        ]);
    })(function(error, result) {
        callbk(error, result);
    });
}

但是,如果在瀑布内的第二个功能出现问题,那么第一个函数的catch上升,它伴随着:

(node:8984) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Callback was already called.
(node:8984) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

我知道将Promise与async.js一起使用并不是一个好主意,但我想了解原因。

我看到的答案很少,但我仍然无法解决。

1 个答案:

答案 0 :(得分:1)

  

我知道将Promise与async.js一起使用并不是一个好主意

好!

  

但我想明白为什么。

如果其中一个回调中的任何(包括传递给getRequest的回复)确实从next();回调中的then调用中抛出异常,承诺会拒绝。不仅如此,被拒绝的承诺上的catch也将执行,现在调用next(e); - 这将使async.js抱怨next回调被调用两次,忽略{{1并使用新的异常拒绝第二个promise。此拒绝不会在任何地方处理,并会记录到您的控制台。

看看difference between .then(…, …) and .then(…).catch(…) - 如果你使用前者,那么原始异常将拒绝承诺并记录为未处理,没有回调被调用两次:

e