如何取消订阅retryWhen并在第一次api调用后在可观察到的和修复的延迟内捕获错误

问题描述 投票:0回答:1

我想延迟api第一个api调用而不是第一个api的延迟,现在如果等待两秒钟,它将发出第一个请求,当我在行为主题上调用next时,我希望它发出第一个请求,然后继续重复一个延迟。

执行retryWhen时我无法退订。

我想抛出一个错误,所以我将其捕获到订阅中并对其进行了处理。或找出我们在retryWhen]中的方法

仅当我们从api返回一些数据时才有效,一旦我们进入重试,我便无法从可观察对象中退订。

// Service
 data = this.subject.pipe(

    switchMap(
      // call the api
      x => this.callAPI((x as any))
        .pipe(
          delay(2000),
          repeat(Infinity),
          retryWhen(errors =>
            errors
              .pipe(
                delayWhen(error => {
                  console.log(error)
                  if (error.status === 404) {
                    throwError(error)
                    return timer(1000 * 1)
                  } else if (error.status === 500) {
                    return timer(1000 * 5)
                  }
                  // don't retry not retry
                  else {
                    return throwError(error)
                  }
                }
                )
              )
          )
        ),
    ),
  )

在我的组件中,我有

unsubscribe: Subject<void> = new Subject()

一旦我们进入重试策略,我想知道这一点,所以我会做一些事情。现在,我不知道,可观察到的旧数据仍然有效,因此我无法向用户呈现错误消息。


    this.sub = this.service.data.pipe(
    takeUntil(this.unsubscribe))
    .subscribe(res => {
      console.log(res)
    },
    x => {
    // as soon as we enter the retry strategy, I want to know that so I do 
       something with.
    console.log(x)

      }
    )

仅当我们从api返回一些数据时才有效,一旦我们进入重试,我便无法从可观察对象中退订。

  ngOnDestroy () {
    console.log('component Destroyed, stop everything')
    this.unsubscribe.next()
    this.unsubscribe.complete()

我想在api第一个api调用之后而不是第一个api之后延迟,现在如果等待两秒钟,它将发出第一个请求,当我在我的行为主题上调用next时,我希望它发出第一个请求,然后...] >

您能帮什么忙?

您可以拥有首先显示请求的属性

并且取决于您可以像这样更改延迟毫秒

您可以更改服务逻辑吗?>

 isFirstRequest = true;
  get data() {
    x => this.callAPI((x as any)).pipe(
      delay(isFirstRequest ? 0 : 2000),
      repeat(Infinity),
      map(response => {
        isFirstRequest = false;
        this.subject.next(response);
        return response;
      }),
      retryWhen(errors =>
        (errors
          .pipe(
            delayWhen(error => {
              console.log(error)
              if (error.status === 404) {
                throwError(error)
                return timer(1000 * 1)
              } else if (error.status === 500) {
                return timer(1000 * 5)
              }
              // don't retry not retry
              else {
                return throwError(error)
              }
            }
            )
          )
        )
      ),
      takeUntil(this.unsubscribe))
    )
    return this.subject;
  }

在您的组件中

    this.sub = this.service.data.pipe(
    takeUntil(this.service.unsubscribe))
    .subscribe(res => {
      console.log(res)
    },
    x => {
    // as soon as we enter the retry strategy, I want to know that so I do 
       something with.
    console.log(x)

      }
    )

 ngOnDestroy () {
    console.log('component Destroyed, stop everything')
    this.service.unsubscribe.next()
    this.service.unsubscribe.complete()
}

javascript angular memory-leaks rxjs angular2-http
1个回答
0
投票

您能帮什么忙?

您可以拥有首先显示请求的属性

© www.soinside.com 2019 - 2024. All rights reserved.