gpt4 book ai didi

javascript - 重试后如何获取catchWhen?

转载 作者:数据小太阳 更新时间:2023-10-29 05:11:40 25 4
gpt4 key购买 nike

我想重试几次 get 请求,并在出现错误时延迟一秒,但如果所有尝试都失败,则执行错误处理程序。

以下代码重试请求,但从未执行 catch。我该如何解决?

import {Response, Http} from '@angular/http';
import {Observable} from 'rxjs/Rx';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
this.http.get("/api/getData").map(data => {
console.log('get')
return data.json()
})
.retryWhen(err => {
console.log('retry')
return err.delay(1000).take(5)
})
.catch(err => {
console.log('catch')
this.handleHttpError(err)
return err
})
.subscribe(data => {
console.log('subscribe')
console.log(data)
})

最佳答案

这里的问题是,当 retryWhen 中的回调返回通知 Observable 发送 complete 通知时,它会进一步传播为 complete 这是不是您想要的描述。

您想将其作为 error 通知发送,这意味着您不能使用 take() 并使用其他运算符重新抛出错误。

例如像这样:

Observable.defer(() => Observable.throw("It's broken"))
.retryWhen(err => {
console.log('retry');
let retries = 0;
return err
.delay(1000)
.map(error => {
if (retries++ === 5) {
throw error;
}
return error;
});
})
.catch(err => {
console.log('catch');
return Observable.of(err);
})
.subscribe(data => {
console.log('subscribe');
console.log(data);
});

您可以自己计算 retries 变量中的重试次数,如果达到某个限制,则重新抛出错误。 map() 运算符用 try-catch block 包装所有回调,因此在其可调用对象中抛出的任何错误都将作为 error 信号发送。

关于javascript - 重试后如何获取catchWhen?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43451392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com