2014-10-08 3 views
3

어떤 전문가가이 문제를 해결할 수 있다면이 문제를 어떻게 해결할 수 있을지 잘 모르겠습니다. 나의 현재 이해는 관찰 할 수있는 것이 게으르며 구독 할 때까지 값을 산출하지 않는다는 것이다. 오류가 발생하면 관찰 대상은 더 이상 값을 보내지 않습니다. 많은 경우에 이것은 원하는 것이 아닙니다.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(){ 

     } 
    ); 

}); 

어떤 제안과 조언이 크게 감사합니다.

미리 감사드립니다.

블레어.

답변

3

.forEach().subscribe()으로 대체해야합니다. 다른 하나의 별칭이기 때문에 .subscribe()이 더 일반적이며이 경우 더욱 명확합니다.

subscribe()는 onNext (첫 번째 기능), onError (두 번째 기능, 옵션), onComplete (세 번째 기능, 선택 사항)의 세 가지 기능을 허용 할 수 있습니다. 따라서 아마도 subscribe()에 두 번째 함수를 제공하여 오류를 처리하기 만하면 원하는 것을 얻을 수 있습니다. 그런 다음 .catch() 연산자에 플래그와 같은 이벤트를 삽입 할 필요가 없습니다.

또한, perthlondon Observables은가 (그들은 서로 종속성이없는) 개념적으로 독립적 특정 사용 케이스를 위해, 당신은 .combineLatest() 대신 .zip()을 사용하고 싶습니다. 차이점에 대한 자세한 내용은 this answer을 참조하십시오.

0

이 게시물에 흥미롭게도 증기가 완료되지 않도록 오류를 표시해야한다고 말합니다. 내 현재의 이해와 RX의 테스트에서

Idiomatic way to recover from stream onError

오류가 가입의의 OnError 핸들러가 불려가는 과정에서 발생되지만 스트림을 완료합니다.

구독자가 더 이상의 메시지를받지 못한다는 의미입니다.

+2

이것은 반드시 질문에 대한 대답을 제공하지 않습니다. 좋은 통찰력이 있지만 의견으로 게시해야합니다. 충분한 평판을 얻을 때 질문, 답변 및 기타 게시물에 대한 의견을 남길 수 있지만 그때까지는 다른 질문으로 질문에 대답하지 마십시오. –