javascript - 在 RxJS 中,如何获取导致错误的值?

标签 javascript rxjs rxjs5

.catch() 中,如何找到导致错误的值?

例如,假设您有这样的代码:

Rx.Observable.of(42)
.map((val) => {
  throw new Error('oops!');
})
.catch((err) => {
  // how can I get `42` here?
});

您怎么知道最终导致错误的原因是什么?

对于奖励积分,这可能在 .finally() 中吗?

最佳答案

如果您需要该值,请将其传递到您的异常中。

Rx.Observable.of(42)
.map((val) => {
  throw new AppError({message : 'oops!', contextInfo : {someName: 42}});
})
.catch((err) => {
  // get it from the `err` object
});

这需要您实现自己的错误类型 (AppError),它继承自 native Error。此技术并非特定于 Rxjs,而是可以应用到任何地方。 Error 是一个对象,您可以通过继承向其添加您认为合适的任何字段。最好让错误包含有关错误的时间(跟踪)/位置(责备分配)/原因(诊断)方面的任何相关信息。

关于如何创建你自己的错误,看看Custom_Error_Types .

finally 运算符使用不带任何参数的选择器函数。因此,如果可以在 finally 中执行此操作,则不会通过参数传递。您可能仍然可以通过关闭来做到这一点,但这远不是我推荐的做法。

更新 引用 How can you know what ended up caused the error?,在一般情况下你不能。就像 promise 一样,错误会传播到它们被捕获的地方,否则最终会从 promise /可观察的上下文中冒出来。所以通常的技术适用,fail fast 技术是最有效的:

  • 快速失败:使用类型系统(您自己的,由您的语言或其他方式提供)- 这样您将确保您只处理预期类型的​​值,因此您可以消除这些类型的错误。我试验了 a babel plugin for contracts如果您已经在使用 babel,我发现它非常有用。
  • 快速失败:尽早发现错误,离错误源头越远,调查就越难。
  • 快速失败:使用具有良好错误报告能力的库,而不是那些没有报告错误的库(在这里,默默吞下错误是你的敌人)。好的图书馆会为此目的提供一个配置参数。
  • 检查堆栈跟踪(使用 rxjs 5,这样做变得更容易,但您仍然需要了解内部结构)
  • 将跟踪/日志信息添加到您的代码等。

关于javascript - 在 RxJS 中,如何获取导致错误的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42982578/

相关文章:

javascript - 使用angularjs恢复默认下拉值

javascript - 嵌套 Observables 在 Ionic2/Angular2 应用程序中表现不同

angular - 来自 Angular Route Guard 的 Web Api 调用

Angular 5 - Rxjs forkJoin

rxjs - BehaviorSubject 初始值不适用于 share()

javascript - 我如何让 TestScheduler 在 RxJs5 中打勾?

javascript - 如何创建 Alloy UI 下拉菜单

javascript - 正则表达式替换回车符

rxjs - RxJS 5 中不存在“mergeDelayError”

php - POST 值不显示在 javascripts 中