2017-01-26 3 views
1

Подумайте, почему мое обещание разрешается, но пытается повторить попытку.Rxjs: повторить обещание?

var getResultsStream = url => Rx.Observable.onErrorResumeNext( 
    Rx.Observable.defer(() => Rx.Observable 
     .fromPromise(getSearchResults(url) 
     .catch(error => Rx.Observable.of(`Error: ${error}`))) 
     .timeout(20000, new Error(`Timeout: ${url}`)) 
    ) 
    .do(e => console.log(`Retrying: ${url}`)) 
    .retry(3) 
) 

Это лучший способ повторить обещание 3 раза?

ответ

2

Если у вас нет специального применения для defer и/или onErrorResumeNext, вы можете бросить, что все и просто использовать:

const request = url => Rx.Observable.of(url) 
 
     .do(url => console.log("requesting: " + url)) 
 
     .switchMap(url => Rx.Observable.fromPromise(getSearchResults(url))) 
 
     .timeout(20000, new Error(`Timeout: ${url}`)) 
 
     .retry(3); 
 

 
request("http://foobar.com").subscribe(console.log, console.error); 
 

 
function getSearchResults(url) { 
 
    // simulating request-error 
 
    throw new Error("Could not reach: " + url); 
 
}
<script src="https://npmcdn.com/@reactivex/[email protected]/dist/global/Rx.umd.js"></script>

+0

я добавил 'onErrorResumeNext' так Wouldn» t разорвать поток, если произошла ошибка, в этом случае, как бы я сохранил поток в живых, если он провалился 3 раза? –

+1

Зачем вам это нужно? Ничего из этого не может произойти - все попытки используются, но также это один из основных принципов rxjs, что ошибки обрабатываются правильно, этот SO-entry несколько связан: http://stackoverflow.com/questions/41827371/how-do-i-throw-an-error-on-the-behavior-subject-and-continue-the-stream/41828984 # 41828984 – olsn

+1

И последнее, но не менее важное: 'onErrorResumeNext' не будет поддерживать поток в потоке (см. документы здесь: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/onerrorresumenext.md) – olsn

Смежные вопросы