我对retryWhen有疑问。
我正在做一个条形码扫描应用程序,要求是当状态码为500时,我们将重试该请求,如果400,则将该条形码推入数组(列出错误为400的条形码)。
如上所述,我需要使用状态代码运行.retryWhen
。
我的代码现在是这样的,但是它总是在出现错误时重试并跳过.subcribe
,我需要处理错误400,我只需要在状态码为500时重试,然后用400推送该条形码进入数组。
let modelItem = {
...
};
this._pickAppSv.updateTicketStatus(modelItem, !endWave)
.retryWhen((obs) => { // Retry when error status is 500, 10 times
return obs
.mergeMap(error => (error.status === 500) ? Observable.throw(error) : Observable.of(error))
.take(9);
})
.subscribe(
(resp: any) => {
...
},
(err) => {
if (err.message === 'Bad Request') { // error 400
this.errorList.push(modelItem);
}
}
);
我进行了很多搜索,但似乎没有解决办法。非常感谢您的帮助。
答案 0 :(得分:1)
您可以这样做
this._pickAppSv.updateTicketStatus(modelItem, !endWave).pipe(
retryWhen(obs => {
return obs.pipe(
mergeMap((response) => {
if (response.status === 500) {
return of(response).pipe(
delay(2000),
take(9)
);
}
if (response.status == 404) {
//do something
throw({error: response});
}
return throwError({error: "Unknown error for asynchronous function:" + response});
}),
);
})
).subscribe({
//do something
});
答案 1 :(得分:1)
Shashank的答案是正确的。但是由于某种原因,我的rxjs版本无法与.pipe
一起使用,因此我做了一些更改。谢谢Shashank。
this._pickAppSv.updateTicketStatus(modelItem, !endWave)
.retryWhen((obs) => { // Retry when error status is 500, 10 times
return obs
.mergeMap((error) => {
if (error.status === 500) {
return Observable.of(error)
.delay(500)
}
if (error.status === 400) {
this.errorList.push(modelItem);
throw({error: error.message});
}
return Observable.throw({error: 'Error:' + error});
})
.take(9);
})
.subscribe({
//do something
});
答案 2 :(得分:0)
如果错误状态不是 401,我使用以下解决方案重试 3 次(延迟 2 秒)
retryWhen(error => {
return error.pipe(
mergeMap(error => {
if (error.status !== 401) {
return of(error);
}
return throwError(error);
}),
scan((acc, error) => {
if (acc > 2) throw error;
return acc + 1;
}, 0),
tap((c) => console.log(`retrying ${c}`)),
delay(2000),
);
}),