为什么concatMap无法一次处理多个请求?

问题描述 投票:-1回答:1

我有一个对象数据/标识数组,该数组作为函数中的参数接收,我应该为每个元素/ id执行一个发布请求:

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中提供的这些选项/答案,但不幸的是,它们都没有起作用。

我尝试了一个不起作用的选项:

 ....
 return from(requests2).pipe(
     concatMap((request) => request.pipe(
         delay(500),
         map( res => {
             // console.log( 'res: ', res );
             return res;
         })
    ))
);

任何想法如何执行多个请求并以更好的方式分别获得每个请求的响应和错误?

angular typescript xmlhttprequest rxjs6
1个回答
0
投票

已修复。这是我的错误原因,导致错误的思考方向,并且在创建数组时也出现了错误。现在的工作方式:

在使用中:

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中输出results $调试所有响应。感谢this question和那里的答案!

© www.soinside.com 2019 - 2024. All rights reserved.