node.js - 链中有 .catch 但使用 Node 6 得到 UnhandledPromiseRejectionWarning

标签 node.js promise warnings unhandled

我有这个 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/

相关文章:

node.js - 在ubuntu 17.04上安装 Node

javascript - 如何在 d3 中使用 Promise.all 而不是队列

javascript - 从使用 .then() 的 Promise 转换为 async/await

firebase - 警告 "It looks like you' 正在使用 Firebase JS SDK 的开发版本。”

Java:未经检查的转换的类型安全警告

node.js - 我可以将 npm node_modules 目录放在我的项目之外吗

node.js - Visual Studio Code - Node 应用程序的启动参数被双引号括起来

node.js - 未处理的PromiseRejection警告: Insufficient funds

rust - 对未记录的部分是否有警告?

javascript - 如何在 FormDataConsumer 中使用异步 javascript 函数(例如 fetch)