重复上一个可观察的

时间:2019-04-28 07:51:15

标签: rxjs

我有一个返回承诺的函数。我想对此捕获错误,然后以指数方式等待更长的时间,然后重试。但是现在我只等待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

1 个答案:

答案 0 :(得分:1)

要进行指数重试,您需要使用retryWhen。这是一个例子:

// will retry with
// 0, 10, 40, 90, 160 ms delays
retryWhen(error$ =>
  error$.pipe(
    delayWhen((_, i) => timer(i * i * 10))
  )
)

exponential backoff

Try this code in a playground

在您的示例中,您要重复 timer,而不是重试 from(connectSocket())。因此,将catchError替换为retryWhen即可获得所需的内容。

希望这会有所帮助

-

此外,还有第三方工具来添加指数补偿,例如
https://github.com/alex-okrushko/backoff-rxjs

请参阅我的 "Error handling in RxJS" 文章,以更好地了解RxJS中的错误和重试。