重试后怎么抓?

Qwe*_*tiy 6 javascript observable rxjs angular

我想get在发生错误时再次尝试重试请求几次,但如果所有尝试都失败,则执行错误处理程序.

以下代码重试请求,但catch永远不会执行.我该如何解决?

import {Response, Http} from '@angular/http';
import {Observable} from 'rxjs/Rx';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
Run Code Online (Sandbox Code Playgroud)
this.http.get("/api/getData").map(data => {
  console.log('get')
  return data.json()
})
.retryWhen(err => {
  console.log('retry')
  return err.delay(1000).take(5)
})
.catch(err => {
  console.log('catch')
  this.handleHttpError(err)
  return err
})
.subscribe(data => {
  console.log('subscribe')
  console.log(data)
})
Run Code Online (Sandbox Code Playgroud)

mar*_*tin 6

这里的问题是,当从回调函数返回的通知Observable retryWhen发送complete通知时,它会进一步传播,因为complete这不是您想要的描述.

您希望将其作为error通知发送,这意味着您无法使用take()和使用其他运算符来重新抛出错误.

例如这样:

Observable.defer(() => Observable.throw("It's broken"))
  .retryWhen(err => {
    console.log('retry');
    let retries = 0;
    return err
      .delay(1000)
      .map(error => {
        if (retries++ === 5) {
          throw error;
        }
        return error;
      });
  })
  .catch(err => {
    console.log('catch');
    return Observable.of(err);
  })
  .subscribe(data => {
    console.log('subscribe');
    console.log(data);
  });
Run Code Online (Sandbox Code Playgroud)

您可以自己计算retries变量中的重试次数,如果达到某个限制,只需重新抛出错误.该map()运营商与包装的try-catch块所有的回调,从而在其赎回引发的任何错误将被发送的error信号.