在RxJS中,如何获得导致错误的值?

时间:2017-03-23 17:06:02

标签: javascript rxjs rxjs5

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

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

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

你怎么知道最终导致错误的原因?

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

1 个答案:

答案 0 :(得分:2)

如果您想要该值,请将其传递给您的例外。

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

这要求您实现自己的错误(AppError),该错误继承自本地Error。此技术并非特定于Rxjs,但可以应用于任何地方。 Error是一个对象,您可以通过继承添加任何您认为合适的字段。错误包括有关错误的何时(跟踪)/何处(责备分配)/原因(诊断)方面的任何相关信息是一种好习惯。

关于如何创建自己的错误,请查看Custom_Error_Types

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

<强>更新 参考How can you know what ended up causing the error?,在一般情况下,你不能。就像promises一样,错误会传播到捕获它们的位置,否则最终会冒充出promise /可观察的上下文。因此,通常的技术适用,fail fast技术最有效:

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