我有这个 promise 链。
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)
});
我正在通过发送一个虚假命令来测试超时 promise ,这将使 sendPort promise 无法解决。超时 promise 通过抛出拒绝赢得了比赛,但在 .catch 处理拒绝之前出现了警告。
这是超时 promise 竞赛
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 将“超时”发送到控制台,以便处理它......尽管不正确??
我正在使用 Node 6,从其他帖子看来,现在如果未在第一个刻度中处理它,则会发出警告。我不知道如何解决这个问题。这应该如何处理?我尝试在超时 promise 之后放置 .catch,但仍然在 .catch 之前收到警告。
最佳答案
_.pTimeout()
返回的 Promise 是孤立的,并且不会处理拒绝。要处理它们,您要么需要在该特定 Promise 上使用 .catch()
,要么需要添加 return
以便将其链接到父 Promise,这样它将得到被更高级别的 .catch()
捕获。我建议返回/链接它,因为您很少希望 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)
});
关于node.js - 链中有 .catch 但使用 Node 6 得到 UnhandledPromiseRejectionWarning,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40076666/