繁体   English   中英

拆分可观察到RxJS中的错误

[英]Split observable on error in RxJS

有了promise,我们可以使用.then的变体在发生错误时拆分链。 这是使用fetch的示例

fetch('http://website.com').then(
  // Perform some logic
  (response) => response.json().then(({ answer }) => `Your answer: ${answer}`),
  // Skip json parsing when an error occurs
  (error) => 'An error occurred :(',
).then(console.log);

这使我可以跳过响应处理逻辑,而仅响应原始fetch语句中引发的错误。 RxJS中类似的内容可能如下所示:

Observable.fromPromise(fetch('http://website.com'))
  // if I put .catch here, the result will be piped into flatMap and map
  .flatMap(response => response.json())
  .map(({ answer }) => `Your answer: ${answer}`)
  // if I put .catch here, errors thrown in flatMap and map will also be caught
  .subscribe(console.log);

由于注释处于代码状态,因此我不能简单地放入catch运算符,因为它的行为与我的promise链不同。

我知道我可以通过涉及实现的自定义运算符来实现它,或者合并一个可观察到的错误,但是这似乎是一个重大的过大杀伤力。 是否有一种简单的方法来实现承诺链行为?

实际上,如果我处于您的情况,则不必担心从flatMapmap捕获错误。 当源Observable抛出错误时,它将传播给观察者。 所以我只在调用订阅时使用错误处理程序(否则错误将被重新抛出):

.subscribe(console.log, err => console.log('error:', err));

请注意,当源Observable(在您的情况下为Promise)中发生错误时,该error将作为error通知而不是作为标准的next通知传播。 这意味着flatMap()map()不会对错误消息产生任何影响 如果使用catch()materialize() ,则两个运算符( flatMapmap )都必须能够处理这种类型的数据(并且不会引发其他错误)。

无论如何,您始终可以使用share()publish()并进行两个不同的订阅,其中每个订阅仅处理一种信号:

let source = Observable.fromPromise(fetch('http://website.com')).publish();

source
  .subscribe(undefined, err => console.log(err));

source
  .flatMap(...)
  .map(...)
  .subscribe(console.log, () => {});

source.connect();

现在,我有一个单独的观察者,仅观察错误。

请注意,我必须使用() => {}进行空的回调,因此该错误将被忽略。 还要注意,在使用多播( publish()运算符)时,主题内部可能会有一些我应该知道的特定行为,但在您的用例中可能并不重要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM