javascript - node.js 获取被拒绝的 Promise 的构造位置

标签 javascript node.js

我从最近使用的 npm 包之一中提取了以下代码。问题是,我无法让 Node 正确报告被拒绝的 promise 是在哪里构造或拒绝的。

const someHiddenEvil = function(error) {
  return Promise.reject(error);
};

const doSomethingBad = function() {
  return Promise.reject(new Error('Bad Things Happened!'));
};

const doSomethingGood = function() {
  return Promise.resolve();
};

const onError = (err) => {
  console.log('caught', err)
};

(function f() {
  let err;
  return doSomethingGood().then(()=>doSomethingBad()).catch((error) => {
    err = error;
    someHiddenEvil(error);
  }).then(()=>onError(err), ()=>onError(err))
})();

我尝试了.catch(当然它不会捕获),process.on('unhandledRejection')node --trace-warnings。然而,所有这些都只给我相同的堆栈跟踪:

Error: Bad Things Happened!
at doSomethingBad (/test.js:5:25)
at doSomethingGood.then (/test.js:18:37)

事实上,被拒绝的 Promise 是在函数 someHiddenEvil 中构造的,并且应该被 catch 回调的匿名函数捕获。上面的信息表明没有任何关于问题实际出在哪里的线索。那么JavaScript中有没有办法获取这些信息呢?

简而言之,当库代码相当复杂、难以阅读且格式不太好时,如何快速解决库中导致未处理的 Promise 拒绝的问题?

最佳答案

你处理错误的方式真的很奇怪。应该是

doSomethingGood().then(doSomethingBad).catch(error => {
    onError(error);
    return someHiddenEvil(error);
//  ^^^^^^
}).catch(onError);

您需要将 someHiddenEvil 中创建的 Promise 返回到链中,以便它可以被捕获。

关于javascript - node.js 获取被拒绝的 Promise 的构造位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52522187/

相关文章:

回调的javascript代码执行顺序与正常执行顺序的矛盾

javascript - 换行后如何获取文本? Javascript

node.js - 如何在 VueJS 上制作图表

javascript - 我如何创建一个清除命令来记录已清除内容的 channel

javascript - Nodejs本地API不起作用

javascript - Safari 在我的图像下方显示空白区域?

javascript - JSON 性能 - 多文件与长单文件

javascript - 仅对自定义模块或 View 应用 JS 自定义 - Odoo

node.js - 如何在没有访问 token 的情况下获取 Google 联系人?

python - 我怎样才能停止PythonShell