[英]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链不同。
我知道我可以通过涉及实现的自定义运算符来实现它,或者合并一个可观察到的错误,但是这似乎是一个重大的过大杀伤力。 是否有一种简单的方法来实现承诺链行为?
实际上,如果我处于您的情况,则不必担心从flatMap
和map
捕获错误。 当源Observable抛出错误时,它将传播给观察者。 所以我只在调用订阅时使用错误处理程序(否则错误将被重新抛出):
.subscribe(console.log, err => console.log('error:', err));
请注意,当源Observable(在您的情况下为Promise)中发生错误时,该error
将作为error
通知而不是作为标准的next
通知传播。 这意味着flatMap()
和map()
不会对错误消息产生任何影响 。 如果使用catch()
或materialize()
,则两个运算符( flatMap
和map
)都必须能够处理这种类型的数据(并且不会引发其他错误)。
无论如何,您始终可以使用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.