2016-10-21 6 views
2

は私のコードです:retryWhenをBooleanを返す関数で使用する方法は?ここ

this._http.post(this._url_get + extension, '', { headers: headers }) 
    .map(res => res['_body']) 
    .retryWhen(errors => {return responseErrorProcess(errors)}) 

今、私はそれが

を再試行する必要がある場合、私はerrorsからの例外を取得する方法を見つけ出すことができませんでしたtrueを返す例外をキャッチし、私のresponseErrorProcess()にそれらを渡す必要があり、これは、それがどのように見えるかです:

Subject_isScalar: falseclosed: falsehasError: falseisStopped: falseobservers: Array[0]thrownError: null__proto__: Observable` 

発生した例外に関するエラーが含まれていないようです、プラス私はreturすべきかを把握することができませんでし実際に再試行するかどうかを決定します。

答えて

6

retryWhenはObservableを返す必要があります。あなたのプロセッサがfalseを返し、エラーの代わりに完了したい場合は

.retryWhen(errors => 
    //switchMap to retrieve the source error 
    errors.switchMap(sourceErr => 
     //send source to processor 
     responseErrorsProcess(sourceErr) ? 
     //if result is TRUE, emit (will cause retry). Else, pass on the error 
     Observable.of(true): Observable.throw(sourceErr) 
    ) 
) 

、ありがとうObservable.empty()

+0

はついに遂に!!どうもありがとう ! –

3

retryWhen()に呼び出し可能なオブジェクトは、completeまたはerrorを出力するObservableを返してストリームを終了するか、resubscribeの値を返します。

例えば、このコードは、理由Observable.empty()のエラーを発することなく完了:

Observable.create(obs => { 
    obs.next(1); 
    obs.next(2); 
    obs.error('error from source'); 
    }) 
    .retryWhen((errors) => { 
     errors.subscribe(sourceError => console.log(sourceError)); 
     return Observable.create(obs => obs.error('inner error')); 
    }) 
    .subscribe(
    val => console.log(val), 
    err => console.log('error', err), 
    _ => console.log('complete') 
); 

nextとしてerrorsに放出される観測源からのエラーを。ソースコードを参照してください:https://github.com/ReactiveX/rxjs/blob/master/src/operator/retryWhen.ts#L86

はこれがコンソールに出力します。

1 
2 
error inner error 
error from source 

はライブデモを参照してください:怒鳴るコメントに基づいてhttp://plnkr.co/edit/Fajsb54WJwB8J8hkUC6j?p=preview

編集:retryWhen()のドキュメントで

ルック:

エラーが発生するとThrowableが放出され、というエラーがObservableに送信されます。これは、notificationHandlerから返されたものです。そのObservableがonCompleteまたはエラーを呼び出す場合、再試行は子サブスクリプションの完了またはエラーを呼び出します。 それ以外の場合、このObservableは、特定のスケジューラ上のソースオブザーバブルに再サブスクリプションします。

したがって、コールバックから返されたObservableは、再サブスクライブするかどうかを決定する責任があります。 next()を発行した場合は、再登録してください。 error()またはcomplete()を発信する場合は、それらを子Observerに渡します。あなたができる例えば

(私はこのコードをテストしていない):

return response.retryWhen((errors) => { 
    var retrySource = new Subject(); 
    errors.subscribe(error => { 
     if (this.responseErrorProcess(error)) retrySource.next(); 
     else retrySource.complete(); 
    }); 
    return retrySource; 
}); 

あなたはretrySourceに正しいメッセージをトリガあなたの内側のロジックによります。

+0

Observable.throw()を置き換える:再試行は、その観測可能発する1回発生します!どのようにエラーを取得するには?実際、httpレスポンスを含んでいる.catch()と同じエラーではありません(私の弱い説明のために申し訳ありません) –

+1

@MotassemMK私の更新された答えを見てください。 http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-retryWhenに記載されているとおりに動作します。しかし、私は説明が非常に頻繁に非常に混乱していることに同意します。 – martin

+0

私は間違いなく優秀です!しかし、(と申し訳ありませんが、2番目のフォローアップの質問)私は再試行する値を返すことができますどのようにflatMap内部から非同期として?これは私が試したものである: –

関連する問題