Qwe*_*tiy 6 javascript observable rxjs angular
我想get在发生错误时再次尝试重试请求几次,但如果所有尝试都失败,则执行错误处理程序.
以下代码重试请求,但catch永远不会执行.我该如何解决?
import {Response, Http} from '@angular/http';
import {Observable} from 'rxjs/Rx';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
Run Code Online (Sandbox Code Playgroud)
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)
})
Run Code Online (Sandbox Code Playgroud)
这里的问题是,当从回调函数返回的通知Observable retryWhen发送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);
});
Run Code Online (Sandbox Code Playgroud)
您可以自己计算retries变量中的重试次数,如果达到某个限制,只需重新抛出错误.该map()运营商与包装的try-catch块所有的回调,从而在其赎回引发的任何错误将被发送的error信号.
| 归档时间: |
|
| 查看次数: |
1875 次 |
| 最近记录: |