[英]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.