2016-11-14 99 views
3

後的訂閱我在那裏的每一標識的我在做一個Ajax請求並處理它們的結果出來的代碼下面是我的實際代碼的簡單複製和jsfiddle繼續錯誤

var ids = [1,2,3,4,5,6]; 
var ids$ = (id) => { 
    return Observable.of(id); 
}; 
var loadIds$ = (id) => { 
    if(id == 4) return xhr('/echo/jsoneee/', {id: id}); 
    return xhr('/echo/json/', {id: id}); 
}; 

Observable.from(ids) 
.concatMap(id => Observable.forkJoin(ids$(id), loadIds$(id))) 
.catch((err, caught) => { 
    //get the id for which loadIds failed 
    //send the id to subscribe() and continue the subscription 
    return Observable.empty(); 
}) 
.subscribe(result => console.log(result)) 

但現在我需要修改代碼,以便如果發生錯誤,我將不得不取得id,其中ajax請求失敗,然後繼續訂閱,就像沒有發生任何事情。我還沒有做到這一點。幫助真的很感激。

+0

這是什麼應該做'.concatMap(ID => Observable.forkJoin(IDS $(ID),loadIds $(ID))) '? – martin

+0

@martin這只是一個模擬,讓事情變得更簡單。但它可以是'forkJoin'或'zip',但其目的是'subscribe()'應該有'id'對象和作爲單個項目的'id' ajax請求的響應,因爲我正在其他內部進行處理訂閱和我需要這兩個數據。 – lbrahim

回答

2

我想你可以通過發出正確的價值觀就在Observable.create(...)顯著簡化這個:

function xhr(url, json) { 
    return Observable.create(function (observer) { 
     $.ajax({ 
      url: url, 
      data: JSON.stringify(json), 
      success: function (response) { 
       observer.next([json.id, json]); 
      }, 
      error: function (jqXHR, status, error) { 
       observer.next([json.id]); // <== Notice this 
      }, 
      complete: function() { 
       observer.complete(); 
      } 
     }); 
    }); 
} 

var ids = [1,2,3,4,5,6]; 
var ids$ = (id) => { 
    return Observable.of(id); 
}; 
var loadIds$ = (id) => { 
    if(id == 4) return xhr('/echo/jsoneee/', {id: id}); 
    return xhr('/echo/json/', {id: id}); 
}; 

Observable.from(ids) 
    .concatMap(id => loadIds$(id)) 
    .subscribe(result => console.log(result)); 

這樣就可以避免forkJoin()完全。另請注意,catch()運營商自動從其來源取消訂閱。此運算符旨在繼續使用另一個Observable,因此在您的情況下它現在非常有用。

你當然可以使用:

.catch((error, caught) => { 
    return caught; 
}) 

然而,這會導致重新訂閱,因此來自這通常是不希望的開始一切價值的再排放。

也有onErrorResumeNext()算子,它只是忽略了錯誤,但這可能不是你想要的。

觀看演示:https://jsfiddle.net/4f1zmeyd/1/

稍微類似的問題:get new ticket then retry first request

+0

根據這個例子,我寧願不必修改'xhr()'。但我不知道爲什麼這個工作正常,但我想用'catch'來實現呢? https://jsfiddle.net/ibrahimislam/ecLp6h1u/ – lbrahim

+0

@lbrahim你不會用'catch()'來處理它,因爲它沒有做你想做的事。 – martin

+0

但是,如果您會看到此示例:https://jsfiddle.net/ibrahimislam/ecLp6h1u。它按預期工作。 – lbrahim