在链中有 .catch 但使用 Node 6 获得 UnhandledPromiseRejectionWarning

Have .catch in chain but getting UnhandledPromiseRejectionWarning using Node 6

我有这个承诺链。

com.openPort(port).then(port => {
                        _.pTimeout(3000, com.sendPort(port, NCD.gen(args.cmd)))
                            .then(received => {
                                console.log('complete response: ', NCD.parse(received));
                                Debug.L1('resolved num data listeners: ', port.listenerCount("data"));
                            })
                    })
                    .catch(function(e) {
                        console.log('error: ', e)
                    });

我正在通过发送伪造的命令来测试超时承诺,该命令将使 sendPort 承诺无法解决。超时承诺在比赛中获胜并抛出拒绝,但在 .catch 处理拒绝之前会发出警告。

这里是超时承诺比赛

pTimeout: function(timeout, promise) {
        return Promise.race([
            promise,
            new Promise(function(resolve, reject) {
                setTimeout(function() {
                    reject('\nTimed out');
                }, timeout);
            })
        ]);
    }

控制台显示

  (node:9616) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): 
  Timed out

您可以在警告后看到 .catch 将 "Timed out" 放入控制台,因此它得到了处理...尽管不正确??

我正在使用节点 6,在其他帖子中似乎是这样,如果它没有在第一个滴答中处理,现在会发出警告。我不知道如何从那些解决这个问题。这应该如何处理?我尝试在超时承诺之后立即放置一个 .catch,但仍然在 .catch 之前收到警告。

_.pTimeout() 返回的承诺是孤立的,未处理拒绝。要处理它们,您需要在该特定承诺上使用 .catch(),或者您需要添加一个 return 以便将其链接到父承诺,以便它会被更高级别捕获 .catch().我建议 returning/chaining 它,因为你很少希望一个 promise 只按自己的步调进行,而根本不与父 promise 相关联:

com.openPort(port).then(port => {
    return _.pTimeout(3000, com.sendPort(port, NCD.gen(args.cmd))).then(received => {
        console.log('complete response: ', NCD.parse(received));
        Debug.L1('resolved num data listeners: ', port.listenerCount("data"));
    });
}).catch(function (e) {
    console.log('error: ', e)
});