将.catch链接在一起,但使用Node 6获取UnhandledPromiseRejectionWarning

时间:2016-10-16 23:34:59

标签: node.js promise warnings unhandled

我有这个承诺链。

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 put" Timed out"到控制台所以它被处理...虽然不正确??

我正在使用节点6,它似乎是其他帖子,现在警告它是否在第一个节拍中没有处理。我无法理解如何解决这些问题。应如何处理?我尝试在超时承诺之后立即放置.catch,但仍然在.catch之前收到警告。

1 个答案:

答案 0 :(得分:4)

_.pTimeout()返回的承诺是孤立的,并且不会处理拒绝。要处理它们,您需要在该特定承诺上使用.catch(),或者您需要添加return,以便将其链接到父承诺,以便它被更高级别{{1}捕获}。我建议归还/链接它,因为你很少想要按照自己的节奏继续进行,而不是完全与父承诺相关联:

.catch()