有了承诺,我们可以使用变体.then
在发生错误时分割链。下面是使用fetch
在RxJS中发生错误可分割
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);
一个例子这让我跳过响应处理逻辑,只会在原有取声明中提出的错误回应。东西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运营商,因为它不具有相同的行为,我的诺言链。
我知道我可以通过自定义操作符来获得它,包括实现或合并一个错误捕捉observable与这个,但这一切似乎是非常重大的矫枉过正。有没有简单的方法来实现承诺链行为?
我想区分这两种错误的原因是因为我可以合理地恢复,或者从'fetch'中的错误(例如您的网络出现问题)提供某种反馈。 如果在flatMap或map中发生错误,可能是我自己的错误,所以我想让错误传播给订阅者。 – Pinpickle
我喜欢你的解决方案,但我的目标是让结果(在这种情况下,来自错误或解析JSON的字符串)成为相同可观察部分。你会建议合并这两个吗? – Pinpickle
比我可能在'Observable.fromPromise()'后面使用'catch()'并且用我自己的错误类('catch()')包装错误,也可以用你自己的错误类重新抛出错误为'error信号)。后来在观察者中,我可以检查错误是typeof还是实现了某个类。这意味着我可以检查错误是否发生在'fromPromise'中,并且被catch()或者来自例如catch。 'map'并且是一个常规错误。也许看看'retryWhen()'操作符也会捕获错误,但让我们根据自己的通知自动重新订阅... – martin