これについて私がどれほど正しいかはわかりませんので、専門家がこれについて私を修正できる場合は、それも高く評価されます. 私の現在の理解では、オブザーバブルは怠け者であり、サブスクライブするまで値を生成しません。エラーが発生した場合、オブザーバブルはそれ以上値を送信しません。多くの場合、これは望んでいるものではありません。
以下のコード サンプルでは、パースとロンドンの天気を取得しています。エラーが発生した場合は、エラーが発生したことを示すオブジェクトを返します。これは、サブスクライバーのエラー ブロックが呼び出されないことを意味しますが、成功は呼び出され、失敗したかどうかを確認してロジックを変更する必要があります。これはこれを行うための最良の方法ですか?
また、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(){
}
);
});
提案やヒントは大歓迎です。
前もって感謝します。
ブレア。