为什么 concatMap 不能同时处理多个请求?
Why concatMap does not work for multiple requests at once?
我有一个对象数组 data/ids 作为函数中的参数接收,我应该为每个 element/id:
执行一个 post 请求
fillProfile(users) {
const requests = [];
console.log( 'USERS.length:', users.length );
requests.push( this.http.post( '/test/add', users[i] ) );
for ( let i = 0; i < users.length; i++) {
return this.http.post( '/test/add', users[i] ).pipe(
map( (res) => {
console.log( 'res: ', res );
return res;
}),
catchError(err => {
return throwError(err);
})
);
}
它在工作,但不是一个好的实践,所以我搜索了一下,可以通过 forkJoin 或其他运算符完成。一直在尝试在 SO 中找到的这些 options/answers 但不幸的是 none 确实有效。
我试过的一个选项不起作用:
....
return from(requests2).pipe(
concatMap((request) => request.pipe(
delay(500),
map( res => {
// console.log( 'res: ', res );
return res;
})
))
);
知道如何更好地执行多个请求并分别获取每个请求的响应和错误吗?
已修复。这是我的错误导致思考方向错误并且在创建数组时也有错误。现在的工作方式:
在职:
getArrayIds(users) {
this.observables = [];
for ( const i in users) {
this.observables.push( this.http.post( '/test/add', users[i] ) );
}
}
fillProfile(users): Observable<any> {
return from(this.observables).pipe(
concatMap((request) => request.pipe(
delay(10),
map( res => {
return res;
})
))
);
}
in *.component.ts:
....
public results$: BehaviorSubject<Array<any>> = new BehaviorSubject([]);
....
this.surveyService.answerSurveyQuestions(body).subscribe(res => {
console.log( 'response: ', res );
this.results$.next(this.results$.getValue().concat(res));
});
甚至可以在 View ans debug 所有的响应中输出 results$。
感谢 和那里的答案!
我有一个对象数组 data/ids 作为函数中的参数接收,我应该为每个 element/id:
执行一个 post 请求fillProfile(users) {
const requests = [];
console.log( 'USERS.length:', users.length );
requests.push( this.http.post( '/test/add', users[i] ) );
for ( let i = 0; i < users.length; i++) {
return this.http.post( '/test/add', users[i] ).pipe(
map( (res) => {
console.log( 'res: ', res );
return res;
}),
catchError(err => {
return throwError(err);
})
);
}
它在工作,但不是一个好的实践,所以我搜索了一下,可以通过 forkJoin 或其他运算符完成。一直在尝试在 SO 中找到的这些 options/answers 但不幸的是 none 确实有效。
我试过的一个选项不起作用:
....
return from(requests2).pipe(
concatMap((request) => request.pipe(
delay(500),
map( res => {
// console.log( 'res: ', res );
return res;
})
))
);
知道如何更好地执行多个请求并分别获取每个请求的响应和错误吗?
已修复。这是我的错误导致思考方向错误并且在创建数组时也有错误。现在的工作方式:
在职:
getArrayIds(users) {
this.observables = [];
for ( const i in users) {
this.observables.push( this.http.post( '/test/add', users[i] ) );
}
}
fillProfile(users): Observable<any> {
return from(this.observables).pipe(
concatMap((request) => request.pipe(
delay(10),
map( res => {
return res;
})
))
);
}
in *.component.ts:
....
public results$: BehaviorSubject<Array<any>> = new BehaviorSubject([]);
....
this.surveyService.answerSurveyQuestions(body).subscribe(res => {
console.log( 'response: ', res );
this.results$.next(this.results$.getValue().concat(res));
});
甚至可以在 View ans debug 所有的响应中输出 results$。
感谢