Angular - RxJs ForkJoin 如何在出错后继续多个请求
Angular - RxJs ForkJoin How To Continue Multiple Requests Even After A Error
我多次查询单个 API 端点,但参数不同。无论出于何种原因,其中一些请求可能会失败并且 return 出现 500 错误。如果他们这样做,我仍然希望其他请求继续进行,并且 return 我所有成功请求的数据。
let terms = [];
terms.push(this.category.category);
terms = terms.concat(this.category.interests.map((x) => x.category));
for (let i = 0; i < terms.length; i++) {
const params = {
term: terms[i],
mode: 'ByInterest'
};
const request = this.evidenceService.get(this.job.job_id, params).map((res) => res.interactions);
this.requests.push(request);
}
const combined = Observable.forkJoin(this.requests);
combined.subscribe((res) => {
this.interactions = res;
});
最容易将每个请求与 catch
链接起来,只发出 null
:
const request = this.evidenceService.get(...)
.map(...)
.catch(error => Observable.of(null)); // Or whatever you want here
失败的请求在 forkJoin
发出的结果数组中只有 null
值。
请注意,在这种情况下你不能使用 Observable.empty()
,因为 empty()
不发射任何东西,只是完成,而 forkJoin
要求所有源 Observables 发射至少一个值.
你可以使用 rxjs catchError :
const request = this.evidenceService.get(this.job.job_id, params)
.pipe(map((res) => res.interactions),
catchError(error => of(undefined)));
我多次查询单个 API 端点,但参数不同。无论出于何种原因,其中一些请求可能会失败并且 return 出现 500 错误。如果他们这样做,我仍然希望其他请求继续进行,并且 return 我所有成功请求的数据。
let terms = [];
terms.push(this.category.category);
terms = terms.concat(this.category.interests.map((x) => x.category));
for (let i = 0; i < terms.length; i++) {
const params = {
term: terms[i],
mode: 'ByInterest'
};
const request = this.evidenceService.get(this.job.job_id, params).map((res) => res.interactions);
this.requests.push(request);
}
const combined = Observable.forkJoin(this.requests);
combined.subscribe((res) => {
this.interactions = res;
});
最容易将每个请求与 catch
链接起来,只发出 null
:
const request = this.evidenceService.get(...)
.map(...)
.catch(error => Observable.of(null)); // Or whatever you want here
失败的请求在 forkJoin
发出的结果数组中只有 null
值。
请注意,在这种情况下你不能使用 Observable.empty()
,因为 empty()
不发射任何东西,只是完成,而 forkJoin
要求所有源 Observables 发射至少一个值.
你可以使用 rxjs catchError :
const request = this.evidenceService.get(this.job.job_id, params)
.pipe(map((res) => res.interactions),
catchError(error => of(undefined)));