在链中捕获,但使用节点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) });