3

これについて私がどれほど正しいかはわかりませんので、専門家がこれについて私を修正できる場合は、それも高く評価されます. 私の現在の理解では、オブザーバブルは怠け者であり、サブスクライブするまで値を生成しません。エラーが発生した場合、オブザーバブルはそれ以上値を送信しません。多くの場合、これは望んでいるものではありません。

以下のコード サンプルでは、​​パースとロンドンの天気を取得しています。エラーが発生した場合は、エラーが発生したことを示すオブジェクトを返します。これは、サブスクライバーのエラー ブロックが呼び出されないことを意味しますが、成功は呼び出され、失敗したかどうかを確認してロジックを変更する必要があります。これはこれを行うための最良の方法ですか?

また、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(){

        }
    );

});

提案やヒントは大歓迎です。

前もって感謝します。

ブレア。

4

2 に答える 2

3

一方は他方のエイリアスであり、この場合はより一般的でより明示的であるため.forEach()、おそらく置き換える必要があります。.subscribe().subscribe()

subscribe() はonNext、(最初の関数)、onError(2 番目の関数、オプション)、onComplete(3 番目の関数、オプション) の 3 つの関数を引数として受け入れることができます。したがって、エラーを処理するために subscribe() で 2 番目の関数を提供するだけで、おそらく目的を達成できます。そうすれば、.catch()オペレーターがフラグのようなイベントを挿入する必要はありません。

また、特定のユース ケースでは、perthlondonObservables が概念的に独立している (相互に依存関係がない) 場合は、.combineLatest()の代わりにを使用します.zip()。両者の違いの詳細については、この回答を参照してください。

于 2014-10-08T18:52:00.403 に答える