编程语言
首页 > 编程语言> > javascript-RxJs处理异常而不终止

javascript-RxJs处理异常而不终止

作者:互联网

我不确定我对此有多正确,因此,如果有任何专家能够对此进行纠正,也将不胜感激.我目前的理解是,可观察变量是惰性的,直到订阅后才产生值.如果发生错误,则可观察对象将不再发送任何值.在很多情况下,这不是想要的.

在下面的代码示例中,我正在获取珀斯和伦敦的天气情况,如果发生错误,则返回一个对象,指示发生了错误.这几乎意味着不会调用订户上的错误块,但是成功将被调用,我将不得不查看它是否失败并更改逻辑.这是最好的方法吗????

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()更常见也更明确.

subscription()可以接受三个函数作为参数onNext(第一个函数),onError(第二个函数,可选),onComplete(第三个函数,可选).因此,您可能只需在subscribe()中提供第二个函数来处理错误,即可实现所需的功能.然后,您不需要.catch()运算符即可插入类似标志的事件.

此外,对于您的特定用例,在珀斯和伦敦Observables在概念上是独立的(它们彼此之间没有依赖性),您想使用.combineLatest()而不是.zip().有关两者之间差异的详细信息,请参见this answer.

标签:rxjs,asynchronous,reactive-programming,javascript
来源: https://codeday.me/bug/20191121/2049825.html