簡體   English   中英

如何將值發送到計時器創建中 function RXJS & Angular

[英]How to emit values into timer creation function RXJS & Angular

我正在嘗試為retry catchError的重試創建一個重試配置。 我需要根據數組中的值發送特定的延遲。 我希望能夠從數組中獲取每個值並將它們單獨發送到計時器創建 function。

例如:

numberArr = [1000, 2000, 3000]

定時器被調用timer(1000) ,然后是timer(2000) ,然后是timer(3000)

使用concatMap僅使用第一個值, switchMap使用最后一個值,但我不確定使用什么來獲取每個發出的數字並將該值用於計時器 function。

歡迎大家提出意見。

   private ob$ = of(1);

   private retryConfig: {
     matcher: () => void;
     retryWaits: number[];
   };

   constructor() {}

   private setRetryConfig(): RetryConfig {
    this.retryConfig = {
      matcher: () => {},
      retryWaits: [3000, 4000, 6000],
    };

    const delayObservable$ = from(this.retryConfig.retryWaits)

    const delayFunction = delayObservable$.pipe(
      tap(() => console.time()),
      tap((x) => console.log('delay', x)),
      concatMap((number) => timer(number)), // this is where I am seeing a problem
      take(this.retryConfig.retryWaits.length),
      tap(() => console.timeEnd()) // this is alway logging 3000ish milliseconds
    );

    return {
      count: this.retryConfig.retryWaits.length,
      delay: () => delayFunction,
    };
  }

   ngOnInit(): void {
    this.ob$
      .pipe(
        tap(() => {
          throw throwError(() => new Error('error'));
        }),
        catchError((error) => throwError(() => new Error(error))),
        retry(this.setRetryConfig())
      )
      .subscribe((x) => {
        if (x) {
          throw throwError(() => new Error('error'));
        }
      });
   }

每次拋出錯誤時都會調用delay function。 我們不能使用數字數組等待 x 次。 相反,我們需要使用當前的重試等待值並等待一次。

我們可以通過在delay回調中調用timer並將retryWaits的第一個元素傳遞給它同時將其從數組中刪除來實現這一點。

const setRetryConfig = () => {
  const retryConfig = {
      matcher: () => {},
      retryWaits: [3000, 4000, 6000],
  };

  return {
    count: retryConfig.retryWaits.length,
    delay: () => timer(retryConfig.retryWaits.shift())
  } 
} 

另請注意,在tap內拋出Error可能不起作用。 我把錯誤扔進了mergeMap中。

of(0).pipe(
  mergeMap(() => {
    console.log("trying")
    return throwError(() => 'Error!');
  }),
  retry(setRetryConfig())
).subscribe(r => console.log("Result", r))

這輸出:

trying
---0s---
---1s---
---2s---
trying
---3s---
---4s---
---5s---
---6s---
---7s---
trying
---8s---
---9s---
---10s---
---11s---
---12s---
---13s---
---14s---
trying
---15s---
Error!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM