Angular retryWhen 条件状态码
Angular retryWhen with condition statuscode
我对 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
});
Shashank的回答是正确的。但是由于某些原因,我的 rxjs 版本无法与 .pipe
一起使用,所以我对其进行了一些更改。谢谢沙山克。
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
});
我使用以下解决方案,如果错误状态不是 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),
);
}),
我对 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
});
Shashank的回答是正确的。但是由于某些原因,我的 rxjs 版本无法与 .pipe
一起使用,所以我对其进行了一些更改。谢谢沙山克。
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
});
我使用以下解决方案,如果错误状态不是 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),
);
}),