如何使用retryWhen使用返回布尔值的函数?

Mot*_* MK 2 rxjs rxjs5 angular2-observables angular

这是我的代码:

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

现在我需要捕获异常并将它们传递给我responseErrorProcess(),true如果它需要重试则返回

我无法弄清楚如何从中检索异常errors,这是它的样子:

Subject_isScalar: falseclosed: falsehasError: falseisStopped: falseobservers: Array[0]thrownError: null__proto__: Observable`
Run Code Online (Sandbox Code Playgroud)

它似乎没有包含有关发生的异常的错误,而且我无法弄清楚应该返回什么以便实际重试.

Bee*_*ice 7

retryWhen应该返回一个Observable.一旦observable发出,重试就会发生:

.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)
    )
)
Run Code Online (Sandbox Code Playgroud)

如果要在处理器返回时完成而不是出错,请false替换Observable.throw()Observable.empty()


mar*_*tin 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')
  );
Run Code Online (Sandbox Code Playgroud)

来自源 Observable 的错误被发送到errorsas next。查看源代码:https : //github.com/ReactiveX/rxjs/blob/master/src/operator/retryWhen.ts#L86

这打印到控制台:

1
2
error inner error
error from source
Run Code Online (Sandbox Code Playgroud)

看现场演示:http : //plnkr.co/edit/Fajsb54WJwB8J8hkUC6j?p=preview

根据以下评论进行编辑:

查看文档retryWhen()

一个错误将导致 Throwable 的发射,从而导致从 notificationHandler 返回的 Observable 的错误。如果 Observable 调用onComplete 或 error,则重试将调用子订阅的 complete 或 error。否则,此 Observable 将在特定调度程序上重新订阅源 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;
});
Run Code Online (Sandbox Code Playgroud)

根据您的内在逻辑,您会在 上触发正确的消息retrySource