2017-02-28 24 views
2

如果3次嘗試後集合不成功,我需要重試一系列RxJS observables並在序列中拋出該項目的錯誤對象。我發現這個例子(An incremental back-off strategy for handling errors):如何從RXJS Observable重試時拋出一個錯誤

var source = get('url').retryWhen(
attempts => 
attempts 
    .zip(Observable.range(1, 3), (_, i) => i) 
    .flatMap(i => { 
    console.log('delay retry by ' + i + ' second(s)'); 
    return Rx.Observable.timer(i * 1000); 
    }); 
); 

var subscription = source.subscribe(
data => { 
// Displays the data from the URL or cached data 
console.log(data); 
}); 

你怎麼扔屬於該項目集合中的錯誤?上述代碼似乎吞噬了錯誤,而不是將其呈現給調用者來處理。 - 在_將是錯誤(_, i) => i

回答

4

在你流,你基本上只是在你zip使用此選擇功能剝奪了錯誤,並僅考慮了計數

我已經調整了你的流並刪除了選擇器函數,這在這裏並不是真的需要 - 現在它會重試3次,如果再次失敗,就會拋出錯誤。

const source = Rx.Observable.create(o => { 
 
    o.error(new Error("always fails")); 
 
    }) 
 
    .retryWhen(attempts => attempts 
 
    .zip(Rx.Observable.range(1, 4)) 
 
    .flatMap(([error, i]) => { 
 
     if (i > 3) { 
 
     return Rx.Observable.throw(error); 
 
     } 
 
     console.log('delay retry by ' + i + ' second(s)'); 
 
     return Rx.Observable.timer(i * 100); 
 
    }) 
 
); 
 

 
source.subscribe(
 
    data => console.log(data), 
 
    error => console.error(error) 
 
);
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

+0

非常感謝你! –