如何将 retryWhen 与 returns 布尔值的函数一起使用?

How to use retryWhen with a function that returns a Boolean?

这是我的代码:

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

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

我不知道如何从 errors 中检索异常,这是它的样子:

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

它似乎不包含有关发生的异常的错误,而且我无法弄清楚我应该 return 什么才能真正重试或不重试。

retryWhen() 的可调用对象需要 return 发出 completeerror 的 Observable 以结束流或发出一个值以重新订阅。

例如,由于 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 的错误作为 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() 的文档:

An error will cause the emission of the Throwable that cause the error to the Observable returned from notificationHandler. If that Observable calls onComplete or error then retry will call complete or error on the child subscription. Otherwise, this Observable will resubscribe to the source observable, on a particular Scheduler.

因此回调中的 Observable return 负责决定是否重新订阅。如果它发出 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 上触发了正确的消息。

retryWhen 应该 return 一个 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)
    )
)

如果您想在处理器 returns false 时完成而不是错误,请将 Observable.throw() 替换为 Observable.empty()