2017-02-28 98 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

非常感谢你! –