在链中捕获,但使用节点6获得UnhandledPromiseRejectionWarning

我有这个承诺链。

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

我正在通过发送一个伪造的命令来testing超时的承诺,这将使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把“超时”的控制台,所以它被处理…虽然不正确?

我正在使用节点6,它看起来像其他职位,现在警告,如果它不是在第一个滴答处理。 我无法理解如何解决这个问题。 这应如何处理? 我试着在超时承诺之后放置一个.catch,但仍然在.catch之前得到警告。

_.pTimeout()返回的诺言是孤立的,不处理拒绝。 要处理它们,你需要一个.catch()这个特定的承诺,或者你需要添加一个return以便它被链接到父承诺,以便它被更高级别的.catch()捕获。 因为你很less要承诺按照自己的节奏行事,并且完全不能接受父母的承诺:

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