- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想以增加的时间间隔触发 retrywhen(),
socketResponse.retryWhen(attempts => {
return attempts.zip(Observable.range(1, 4)).mergeMap(([error, i]) => {
console.log(`[socket] Wait ${i} seconds, then retry!`);
if (i === 4) {
console.log(`[socket] maxReconnectAttempts ${i} reached!`);
}
return Observable.timer(i * 1000);
});
});
上面的代码工作正常。当前实现输出:
连接错误(第一次)
连接成功
//连接成功。
关于连接错误(第二次)
现在我想重置套接字连接成功时的等待时间。
期望的输出:
连接错误(第一次)
连接成功
//连接成功。
关于连接错误(第二次)
[socket] 等待 1 秒,然后重试!//等待 1 秒
[socket] 等待 2 秒,然后重试!//等待 2 秒
但我不知道如何重置 retrywhen() 时间间隔。
最佳答案
我也遇到了同样的问题。我的目标是用可观察对象包装套接字连接。我希望网络 observable 永远不会完成(除非特别要求)并在出现任何错误时无限重试连接。
下面是我如何完成的(使用 rxjs 版本 6+)。这是我的 retryWhen
运算符,无限重试,同时添加缩放等待持续时间 scalingDuration
,最高为 maxDuration
。
import { Observable, timer } from 'rxjs';
import { mergeMap } from 'rxjs/operators';
export const infiniteRetryStrategy = (opts: { scalingDuration: number, maxDuration: number }, attempt?: () => number) => (attempts: Observable<{}>) => {
return attempts.pipe(
mergeMap((error, i) => {
// use attempt if we have it, otherwise use the number of errors received
const retryAttempt = attempt ? attempt() : i + 1;
const waitDuration = Math.min(opts.maxDuration, retryAttempt * opts.scalingDuration);
console.error(`Got error: ${error}. Retrying attempt ${retryAttempt} in ${waitDuration}ms`);
return timer(waitDuration);
})
);
};
用法非常简单。如果您提供 attempt
函数,您可以在外部管理重试次数,因此您可以在下一次报价时重置它。
import { retryWhen, tap } from 'rxjs/operators';
class Connection {
private reconnectionAttempt = 0;
public connect() {
// replace myConnectionObservable$ by your own observale
myConnectionObservable$.pipe(
retryWhen(
infiniteRetryStrategy({
scalingDuration: 1000,
maxDuration: 10000
}, () => ++this.reconnectionAttempt)
),
tap(() => this.reconnectionAttempt = 0)
).subscribe(
(cmd) => console.log(cmd),
(err) => console.error(err)
);
}
}
这并不完美,因为您需要将状态保持在流之外,但这是我设法做到的唯一方法。欢迎任何更清洁的解决方案。
关于javascript - RXJS retryWhen 重置等待间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48519080/
我正在编写逻辑,用于每 t 秒检查一个对象的状态,直到它完成。我决定使用 retryWhen 运算符。 getObjectStatus(someObject: someObjectInstance)
我正在关注 this tutorial然后添加这一行: .retryWhen(errors -> errors.flatMap(error -> Observable.timer(30, TimeUn
我一直在使用 retryWhen() 方法,我注意到如果你在 retryWhen() 中使用 filter() 并且如果 filter() 失败,则不会执行回调,甚至 onCompleted() 也不
我对 retryWhen 有疑问。 我正在做一个条形码扫描应用程序,要求是当状态代码为500时,我们将重试请求,如果为400,则将该条形码推送到数组中(列出错误400的条形码)。 我需要按照上面的要求
我正在通过重试实现数据库更新方法。遵循 retryWhen() 运算符的通用模式,如下所述:Using Rx Java retryWhen() .. ..但是我的重试逻辑从未执行过。我正在调试它,可以
看,我在 StackBlitz 上创建了问题 https://stackblitz.com/edit/rxjs-nndpag 我不知道如何正确使用 retryWhen 运算符。我希望它重新订阅我的 p
我正在尝试使用 java Rx(版本 1)重试。 我想要执行 retryWhen 而不是简单的 retry() 因为我希望在达到限制时返回具有特定值的可观察值,而不是仅仅抛出异常. 所以,检查这个 h
我使用 RXJava 调用一个昂贵的递归函数。大多数时候它运行得非常快,但有时它会生成太长的 take 方式 如果线程仍在运行,有没有办法在 5 秒后使用 retryWhen()? observab
我正在学习如何在 RxJava2 中进行数据轮询 到目前为止,这是我的代码。 private io.reactivex.Single getMyTask() { return io.
当对我的外部服务之一的外部 http 请求失败时,我正在使用 retryWhen。问题是我正在使用 RxHelper.toObservable(httpClient.request(method,
我有这样的东西: service.getStuff() .map(...) .observeOn(AndroidSchedule
我是 rxJava 的新手,这可能是一个非常愚蠢的问题,但我无法弄清楚如何在重试时找到异常类型。我想在特定异常(例如 Io 异常)上重试,但在其他异常上重试我想将异常传递到链中。 public Obs
我在 Android 应用程序中使用 Retrofit 和 RxJava 进行通信,并且必须处理解析来自看似正常的 HTTP 响应(状态 200 代码)的响应时的错误。 我还实现了一种使用 retry
我有一个应用程序需要 session (cookie) 来处理网络调用。我正在使用 Retrofit+RxJava。但是, session 可能会过期(Retrofit 错误,状态为 401 Unau
我一直在尝试在 RxSwift 上测试 retryWhen 运算符,但遇到了 Reentrancy Anomaly 问题,这是代码: Observable.create { observer in
我正在玩 RxJava retryWhen运算符(operator)。在互联网上很少找到关于它的信息,唯一值得一提的是 this .这也不足以探索我想了解的各种用例。我还加入了异步执行并通过回退重试,
我想以增加的时间间隔触发 retrywhen(), socketResponse.retryWhen(attempts => { return attempts.zip(Observab
我正在尝试进行 API 调用(使用 angular4),它会在失败时使用 retryWhen 重试。我希望它延迟 500 毫秒并重试。这可以通过以下代码实现: loadSomething(): Obs
如何在 retryWhen 中设置延迟? import 'rxjs/add/operator/retry'; import 'rxjs/add/operator/retrywhen'; ... con
我正在创建一个 Angular Http 重试拦截器。当我重试 1 次时,我的代码如下所示: return next.handle(req).pipe( retryWhen((error)
我是一名优秀的程序员,十分优秀!