我有一个返回承诺的函数。我想对此捕获错误,然后以指数方式等待更长的时间,然后重试。但是现在我只等待5s不变。这是我的代码:
from(connectSocket()).pipe(
catchError(e => {
console.log('got error!', e.message);
return timer(5000).pipe(
tap(() => console.log('will repeat connect now')),
repeat(1)
);
}),
tap(() => setIsConnected.next(true))
);
但是不会重复。
我的完整代码在此沙箱中-https://stackblitz.com/edit/rxjs-g7msgv?file=index.ts
答案 0 :(得分:1)
要进行指数重试,您需要使用retryWhen
。这是一个例子:
// will retry with
// 0, 10, 40, 90, 160 ms delays
retryWhen(error$ =>
error$.pipe(
delayWhen((_, i) => timer(i * i * 10))
)
)
在您的示例中,您要重复 timer
,而不是重试 from(connectSocket())
。因此,将catchError
替换为retryWhen
即可获得所需的内容。
希望这会有所帮助
-
此外,还有第三方工具来添加指数补偿,例如
https://github.com/alex-okrushko/backoff-rxjs
请参阅我的 "Error handling in RxJS" 文章,以更好地了解RxJS中的错误和重试。