3

これが私のコードです:

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

ここで、例外をキャッチして、再試行する必要がある場合にresponseErrorProcess()返される my に渡す必要がありますtrue

から例外を取得する方法がわかりませんでしたerrors。これは次のようになります。

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

発生した例外に関するエラーは含まれていないようです。さらに、実際に再試行するかどうかを判断するために何を返せばよいかわかりませんでした。

4

2 に答える 2

8

retryWhenObservable を返す必要があります。オブザーバブルが発行すると、再試行が発生します。

.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)
    )
)

プロセッサが を返したときにエラーではなく完了したい場合は、次のようfalseに置き換えObservable.throw()ますObservable.empty()

于 2016-10-23T14:27:20.097 に答える
5

callable toretryWhen()は、発行する Observable を返すcompleteerror、ストリームを終了するか、値を発行して再サブスクライブする必要があります。

たとえば、次の理由により、このコードはエラーを発生せずに完了します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')
  );

ソース Observable からのエラーはerrorsasに出力されnextます。ソースコードを参照してください: 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 が、 notificationHandler から返された Observable に発行されます。その Observable がonComplete または errorを呼び出した場合、再試行すると子サブスクリプションで complete または error が呼び出されます。それ以外の場合、この Observable は、特定の Scheduler でソース observable に再サブスクライブします。

したがって、コールバックから返された Observable は、再サブスクライブするかどうかを決定する責任があります。が発行された場合はnext()、再サブスクライブします。それらを子オブザーバーに発行error()または渡す場合。complete()

たとえば、次のことができます (このコードはテストしていません)。

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

内部ロジックによると、 で正しいメッセージをトリガーしますretrySource

于 2016-10-22T15:32:04.080 に答える