catch-and-replace Rx Observable流/序列

时间:2015-08-30 22:17:58

标签: error-handling rxjs

假设我有两个已经暴露为Observable的远程AJAX调用的可观察性受损。这些流是一系列价值观的平台。

In[44]: scipy.stats.chisqprob(5.991, 2)
Out[44]: 0.050011615026579088

为了论证,想象一下以下定义:

var remoteData = Rx.Observable.merge(
  data1,
  data2);

我希望获取所有data1和所有data2 ,如果有任何错误使用缓存数据。

但是,如果我要写var data1 = Rx.Observable.from([1,2,3]); // Multiple items! var data2 = Rx.Observable.throw("Whoops!"); ,它会追加到输出流,只会在错误之后添加缓存的数据。这是因为catch仅从不同的可观察对象继续序列:

  

继续一个可观察的序列,该序列由具有下一个可观察序列的异常终止。

这是有问题的,因为错误可能是由data2引起的(甚至是data1 steam中的更晚);但是,cacheData应取代任何所有结果来自错误的来源。

例如,如果var dataOrCache = remoteData.catch(cachedData)最终序列为cacheData = Rx.Observable.from(["cached"]),则所需目标为[1,2,3,"cached"]

我查看了Getting Started: Errors,但我无法处理这种情况,因为它不是列出的方案之一。显示的“缓存”情况假定在返回任何结果之前发生错误的快速observable错误。

我正在寻找一种方法来通过不同的流组合或其中一个内置的运算符方法来处理它,我不想将它解包到显式的可观察源。

1 个答案:

答案 0 :(得分:1)

不确定我是否了解所有内容,但是:

  • 如果你想在ajax调用失败时从缓存中获取值,你可以这样做:

var remoteData = Rx.Observable.zip( data1.catch(getFromCache('data1')), data2.catch(getFromCache('data2')) )

这使用catch运算符的实例版本和签名Rx.Observable.prototype.catch(handler):cf。 https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/catchproto.md

您的getFromCache函数必须返回一个promise或一个observable。 无论是从缓存还是从ajax调用中获取data1和data2,remoteData都会发出一个值。

  • 如果您希望在其中一个ajax调用失败后立即从缓存中获取值:

var remoteData = Rx.Observable.zip(data1, data2).catch(getDataFromCache('data1','data2'))

我没有测试过,但请告诉我这是否对您有用。