【问题标题】:Promise reject "... not defined", how do I find the source [duplicate]承诺拒绝“......未定义”,我如何找到来源[重复]
【发布时间】:2018-03-04 10:31:16
【问题描述】:

我的应用程序有很多模块,并且到处都使用 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 is not defined”

【问题讨论】:

  • 仅供参考,return Promise.resolve 没有任何意义,因为这只是返回一个函数引用。也许你的意思是return Promise.resolve()。另外,也没有任何意义,您可以直接使用return value;
  • 使用Bluebird promise 库,它将捕获被拒绝承诺的堆栈跟踪。除此之外,缩小拒绝来源的常用方法是将.catch() 语句记录在更接近拒绝来源的位置。 .catch(err => {console.log("something useful", err); throw err;});
  • jfriend00,不错。我将更新示例。我的示例通过 then 中返回的任何内容的副作用来工作,然后自动包装在 Promise.resolve 中。所以我的例子返回了一个已解决的承诺,一个函数的参数来生成一个解决承诺。

标签: javascript node.js promise


【解决方案1】:

一个可能的解决方案是为 promise 制作一个解析器包装器,它接受拒绝消息。

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) })

【讨论】:

  • 这需要包装每个承诺。与抓住每一个承诺没有太大区别。我希望有一些全局的东西来告诉 nodejs,而不是用一条小的神秘消息将异常变成拒绝,创建一个回溯。
  • 我在文档中找到了以下内容。但只有在根本没有捕获时才有效。process.on('unhandledRejection', (reason, p) => { console.log('******Unhandled Rejection at:', p, 'reason:' , reason); // 应用程序特定的日志记录、抛出错误或其他逻辑 });
猜你喜欢
  • 2019-04-22
  • 2015-11-19
  • 1970-01-01
  • 2020-04-04
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 2017-10-25
相关资源
最近更新 更多