[英]How to send independent http request in sequence angular
我想依次发送10个独立的请求。 并希望在一个数组中获得所有结果。 我试过
forkJoin<\/code>但它同时满足了所有请求。
对于并行请求
search(queryUrls) {
queryUrls.forEach((query) => {
observableBatch.push(this.http.post(query.url, query.data))
.pipe(
map((res) => res),
catchError(e => of('Error'))
);
});
//
return forkJoin(observableBatch);
}
你需要使用concat
。
concat将订阅第一个输入Observable并发出其所有值,而不以任何方式更改或影响它们。 当Observable完成时,它将订阅然后传递下一个Observable,并再次发出其值。 这将重复,直到操作员用尽Observables。 当最后一个输入Observable完成时,concat也将完成。
如果您希望将所有这些结果收集到一个数组中,则需要使用toArray
运算符来折叠结果。
在你的情况下,它看起来像:
const batched = queryUrls.map(query => this.http.post(query.url, query.data))
concat(batched).pipe(toArray()).subscribe(allResults => /**/)
解决方案(concatMap保持请求的顺序)
const results = [];
search(queryUrls) {
from(queryUrls).pipe(
concatMap((query) => this.http.post(query.url, query.data)),
catchError(e => of('Error'))
).subscribe((response) => results.push(response.body));
}
说明: mergeMap、switchMap、concatMap的区别
如果你想在所有请求完成后将结果发送到另一个 observable 中,你可以这样做
output$ = new Subject();
search(queryUrls) {
const results = [];
from(queryUrls).pipe(
concatMap((query) => this.http.post(query.url, query.data)),
catchError(e => of('Error'))
).subscribe(
(response) => results.push(response.body),
() => {},
() => { output$.next(results); } // this is executed on complete
);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.