RxJs处理例外而不终止

RxJs处理例外而不终止

问题描述:

我不知道我对此有多正确,所以如果有专家能够纠正我对此,它也将不胜感激。我目前的理解是,观察者是懒惰的,在订阅之前不会产生价值。如果发生错误,observable将不会发送更多值。在很多情况下,这不是我们想要的。RxJs处理例外而不终止

在下面的代码示例中,我得到了perth和london的天气,如果发生错误并返回指示出现错误的对象。这很大程度上意味着订阅者的错误块不会被调用,但是成功了,我将不得不查看它是否失败并更改逻辑。这是做这个最好的方法吗?

此外,zip操作符是否等待所有obs生成一个值,无论订购和返回何时生成单个值?如下面

代码:

window.application = application || {}; 

window.application.stocks = (function(){ 


    function getWeather(city, country){ 

     return $.ajaxAsObservable({ 
      url: 'http://api.openweathermap.org/data/2.5/weather?q=' + city + ',' + country, 
      dataType: 'jsonp' 
     }).map(function(v){ 
      return { 
       city : city, 
       country : country, 
       temperature : v.data.main.temp 
      }; 
     }); 
    } 

    var requests = Rx.Observable 
        .interval(500) 
        .timestamp() 
        .map(function(v){ 
        var perth = getWeather('perth','au'); 
        var london = getWeather('london','uk'); 

        return Rx.Observable.zip(perth,london, function(a,b){ 
         return { 
          a : a, 
          b : b, 
          timestamp : v.timestamp, 
          failure : false, 
         }; 
        }).retry(3) 
         .catch(Rx.Observable.return({ failure: true })); 

        }) 
        .concatAll(); 

    var selector = $('#weather'); 

    var subscriber = requests.forEach(
     function(data){ 

      if(data.failure){ 
       $('<li>Failure in receiving the temperature</li>').appendTo(selector); 
       return; 
      } 

      $('<li> at: ' + data.timestamp + ' for: ' + data.a.city + ' - ' + data.a.temperature + '</li>').appendTo(selector); 
      $('<li> at: ' + data.timestamp + ' for: ' + data.b.city + ' - ' + data.b.temperature + '</li>').appendTo(selector); 
     }, 
     function(error){ 
      selector.text(''); 
      $('<li>Error: ' + error + '</li>').appendTo('#weather'); 
     }, 
     function(){ 

     } 
    ); 

}); 

任何建议和提示是极大的赞赏。

在此先感谢。

布莱尔。

您可能应该将.forEach()替换为.subscribe(),因为一个是另一个的别名,在这种情况下.subscribe()更常见,也更明确。 subscribe()可以接受三个函数作为参数onNext(第一个函数),onError(第二个函数,可选),onComplete(第三个函数,可选)。因此,你可能会通过在subscribe()中提供第二个函数来实现你想要的,以处理错误。那么你不需要运营商插入一个类似旗帜的事件.catch()

此外,对于您的具体使用情况,其中perthlondon观测量概念无关的(他们没有依赖彼此),要使用.combineLatest(),而不是.zip()。有关两者之间的区别的详细信息,请参见this answer

有趣的是,这篇文章说,你需要标记错误,以便蒸汽不能完成。

Idiomatic way to recover from stream onError

从我目前的理解和RX的测试过程中,如果认购的onError的处理程序将调用期间抛出的错误,但它会完成流。

这意味着用户将不会收到更多消息。

+2

这并不一定会提供问题的答案。虽然良好的洞察力,它应该作为评论发布。当您获得足够的声望时,您将能够在问题,答案和其他帖子上发表评论,但在此之前,尽量不要用另一个问题回答问题。 – 2015-01-07 21:47:50