Redux 在超时时重新执行可观察重试
我希望使用redux observable来处理ajax超时,这样,如果超时发生(比如10秒后),它将再次重试请求两次(每次都触发Redux 在超时时重新执行可观察重试,redux,rxjs,rxjs5,redux-observable,Redux,Rxjs,Rxjs5,Redux Observable,我希望使用redux observable来处理ajax超时,这样,如果超时发生(比如10秒后),它将再次重试请求两次(每次都触发SAVE\u RETRYING操作,以便UI可以通知用户它正在重试) 对于任何其他类型的错误,或者如果我们已经重试了两次,它应该失败并触发SAVE\u FAILURE操作 如果我使用store.dispatch触发SAVE\u RETRYING操作,我可以让它工作,但是收到了关于这一点的弃用警告,我有点难以找到正确的方法(将SAVE\u RETRYING添加到epic
SAVE\u RETRYING
操作,以便UI可以通知用户它正在重试)
对于任何其他类型的错误,或者如果我们已经重试了两次,它应该失败并触发SAVE\u FAILURE
操作
如果我使用store.dispatch
触发SAVE\u RETRYING
操作,我可以让它工作,但是收到了关于这一点的弃用警告,我有点难以找到正确的方法(将SAVE\u RETRYING
添加到epic返回的流中)
以下是我所做的(简化):
如何将
SAVE\u RETRYING
操作升级到主流?Thx.这并不理想,但您可以使用catch
和未记录的第二个参数(这是可观察到的源)重新订阅。我不喜欢的缺点是,您必须在mergeMap
回调闭包中计算重试次数
function saveEpic(action$, store) {
return action$.ofType('SAVE_CLICKED')
.mergeMap(action => {
let retries = 0;
return ajax({
url: '/a-long-request',
})
.timeout(10000)
.map(() => ({ type: 'SAVE_SUCCESS' }))
.catch((error, source) => {
retries += 1;
if (retries >= 2 || error.name !== 'TimeoutError') {
return Observable.of({ type: 'SAVE_FAILURE' });
}
return source.startWith({ type: 'SAVE_RETRYING', count: retries });
})
.startWith({ type: 'SAVE_STARTED' });
});
}
这并不理想,但您可以使用
catch
和未记录的第二个参数(可观察的源)重新订阅。我不喜欢的缺点是,您必须在mergeMap
回调闭包中计算重试次数
function saveEpic(action$, store) {
return action$.ofType('SAVE_CLICKED')
.mergeMap(action => {
let retries = 0;
return ajax({
url: '/a-long-request',
})
.timeout(10000)
.map(() => ({ type: 'SAVE_SUCCESS' }))
.catch((error, source) => {
retries += 1;
if (retries >= 2 || error.name !== 'TimeoutError') {
return Observable.of({ type: 'SAVE_FAILURE' });
}
return source.startWith({ type: 'SAVE_RETRYING', count: retries });
})
.startWith({ type: 'SAVE_STARTED' });
});
}
工作起来很有魅力:)如果没有人能在接下来的一段时间内提供一个没有缺点的答案,我会接受这个答案。工作起来很有魅力:)如果没有人能在接下来的一段时间内提供一个没有缺点的答案,我会接受这个答案。