Почему concatMap не работает для нескольких запросов одновременно? - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть массив данных / идентификаторов объектов, полученных в качестве параметра в функции, где я должен выполнить запрос post для каждого элемента / 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;
         })
    ))
);

Любая идея, как выполнить несколько запросов а также получить ответ и ошибку каждого отдельно в лучшем подходе?

1 Ответ

0 голосов
/ 23 апреля 2020

Fixed. Это была моя ошибка, потому что я думал не в том направлении и имел ошибку при создании массива. Как это работает сейчас:

в обслуживании:

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;
            })
        ))
    );
}

в * .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 и отладить весь ответ. Благодаря этот вопрос и ответы там!

...