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()
。
此外,对于您的具体使用情况,其中perth
和london
观测量概念无关的(他们没有依赖彼此),要使用.combineLatest()
,而不是.zip()
。有关两者之间的区别的详细信息,请参见this answer。
有趣的是,这篇文章说,你需要标记错误,以便蒸汽不能完成。
Idiomatic way to recover from stream onError
从我目前的理解和RX的测试过程中,如果认购的onError的处理程序将调用期间抛出的错误,但它会完成流。
这意味着用户将不会收到更多消息。
这并不一定会提供问题的答案。虽然良好的洞察力,它应该作为评论发布。当您获得足够的声望时,您将能够在问题,答案和其他帖子上发表评论,但在此之前,尽量不要用另一个问题回答问题。 – 2015-01-07 21:47:50