我对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);
}
}
);
我进行了很多搜索,但似乎没有解决办法。非常感谢您的帮助。
您可以做这样的事情
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
});
沙申克的答案是正确的。但是由于某种原因,我的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
});
大约400响应变成错误。因此,您必须操纵结果。
this._pickAppSv.updateTicketStatus(modelItem, !endWave).
pipe(
map(res => {
if( res.status === 500){
throw res;
}
return res;
}),
retryWhen(res => {
res.pipe(take(10))
})
).subscribe( data => {
if (err.message === 'Bad Request') { // error 400
this.errorList.push(modelItem);
}
})