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