承诺拒绝“......未定义”,我如何找到来源

时间:2017-09-22 19:01:05

标签: javascript node.js promise

我的应用程序有很多模块,并且在所有地方都使用了承诺。

有时,在其中一个模块中,我的代码会引发异常 并且承诺链被拒绝。如果此错误可重现, 我可以单步执行直到找到异常。但事实并非如此。

如何让nodejs生成回溯以识别有罪的模块,功能和代码行?

这是一个简单的例子。

'use strict';

// pretend multiple modules, each with deep complicated chains of Promises 
Promise.resolve()
   .then(() => { return Promise.resolve() })
   .then(() => { return Promise.resolve() })
   .then(() => { return Promise.resolve() })
   .then(() => {
       x = "find me if you can, x is very common variable name";
       return Promise.resolve
   })
   .then(() => { return Promise.resolve() })
   .then(() => { return Promise.resolve() })
   .catch((e) => { console.log("where did you come from " + e) })

上面的输出是“你是从哪里来的ReferenceError:x未定义”

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案是为promises创建一个解析器包装器,它接受拒绝消息。

const resolver = (resolveItem, rejectMessage) => {
  return Promise
  .resolve(resolveItem)
  .catch(err => Promise.reject({...err, myMessage: rejectMessage}))
}

Promise.resolve()
.then(() => { return resolver(function1(a, b, c), "1") })
.then(() => { return resolver(function2(a, b, c), "2") })
.then(() => { return resolver(function3(a, b, c), "3") })
.catch((e) => { console.log("I came from " + e.myMessage) })