无法重试 API 调用获取成功事件
Unable to make a retry for API call Getting the success event
我需要使用 fork-join 进行多次 API 调用,如果 API 中的任何一个调用在 3 秒后甚至 API 失败那么我们不应该去订阅。并且重试也应该发生一次重试就是这样
针对以上需求,我是通过以下方式实现的:-
const getPosts = this.api
.get("/posts/")
.pipe(catchError(this.getCatchError));
const getPostsFaliure = this.api.get("/postsasdfs/")
.pipe(catchError(this.getCatchError));
;
forkJoin(getPosts, getPostsFaliure)
.pipe(
retryWhen(err => {
err.pipe(
tap(val => console.log(`Value ${val} was too high!`)),
//restart in 6 seconds
delayWhen(val => timer(val * 1000))
);
})
)
.subscribe(res => console.log(res));
getCatcherror 是这样的:-
getCatchError(error) {
return of(false);
}
对于上述实施,我得到以下结果:-
[Array(100),false]
它不会出错并且重试对我也不起作用 API 调用只会进行一次,我需要限制它订阅直到 API s 通过如果在至少有一个失败了,我需要去订阅错误的部分。而且我有一个严格的规则,从 rxjs 时使用重试
如何解决这个问题
Stackblitz URL:-https://stackblitz.com/edit/angular-api-call-cpr1hk?file=src/app/app.component.ts
您正在使用 of(false)
将错误切换为有效通知。必须删除它才能调用 retryWhen
。
- 您可以使用显式变量来表示重试尝试。
- Return 来自
catchError
块的 throwError
(转发错误)或 EMPTY
常量(完成可观察的)。
import { forkJoin, throwError, EMPTY } from 'rxjs';
import { catchError, retryWhen } from 'rxjs/operators';
const getPosts = this.api.get("/posts/");
const getPostsFaliure = this.api.get("/postsasdfs/");
let retry = 0; // max 3 allowed
forkJoin(getPosts, getPostsFaliure).pipe(
catchError(err => {
if (retry <= 3) {
retry++;
return throwError(err);
}
return EMPTY; // <-- complete the observable if max retries reached
}),
retryWhen(err => err.pipe(delay(3000)))
).subscribe(res => console.log(res));
我需要使用 fork-join 进行多次 API 调用,如果 API 中的任何一个调用在 3 秒后甚至 API 失败那么我们不应该去订阅。并且重试也应该发生一次重试就是这样 针对以上需求,我是通过以下方式实现的:-
const getPosts = this.api
.get("/posts/")
.pipe(catchError(this.getCatchError));
const getPostsFaliure = this.api.get("/postsasdfs/")
.pipe(catchError(this.getCatchError));
;
forkJoin(getPosts, getPostsFaliure)
.pipe(
retryWhen(err => {
err.pipe(
tap(val => console.log(`Value ${val} was too high!`)),
//restart in 6 seconds
delayWhen(val => timer(val * 1000))
);
})
)
.subscribe(res => console.log(res));
getCatcherror 是这样的:-
getCatchError(error) {
return of(false);
}
对于上述实施,我得到以下结果:-
[Array(100),false]
它不会出错并且重试对我也不起作用 API 调用只会进行一次,我需要限制它订阅直到 API s 通过如果在至少有一个失败了,我需要去订阅错误的部分。而且我有一个严格的规则,从 rxjs 时使用重试 如何解决这个问题
Stackblitz URL:-https://stackblitz.com/edit/angular-api-call-cpr1hk?file=src/app/app.component.ts
您正在使用 of(false)
将错误切换为有效通知。必须删除它才能调用 retryWhen
。
- 您可以使用显式变量来表示重试尝试。
- Return 来自
catchError
块的throwError
(转发错误)或EMPTY
常量(完成可观察的)。
import { forkJoin, throwError, EMPTY } from 'rxjs';
import { catchError, retryWhen } from 'rxjs/operators';
const getPosts = this.api.get("/posts/");
const getPostsFaliure = this.api.get("/postsasdfs/");
let retry = 0; // max 3 allowed
forkJoin(getPosts, getPostsFaliure).pipe(
catchError(err => {
if (retry <= 3) {
retry++;
return throwError(err);
}
return EMPTY; // <-- complete the observable if max retries reached
}),
retryWhen(err => err.pipe(delay(3000)))
).subscribe(res => console.log(res));