我从最近使用的 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/