Как я могу узнать, был ли конкретный запрос выполнен с помощью forkJoin в Angular 5 как часть параллельной обработки запроса?

У меня есть требование обрабатывать список запросов параллельно с помощью forkJoin в Angular 5. Я взял ссылку из этой ссылки Рецепты RxJS: 'forkJoin' с прогрессом выполнения для массовых сетевых запросов в Angular

У меня здесь одна проблема. Я не могу точно узнать, какой запрос был выполнен, но могу узнать количество выполненных запросов.

Кто-нибудь может сообщить мне, как я могу узнать, какой конкретный запрос был выполнен?

Вот код ниже

let Rx = window.Rx = window['rxjs'];
let {forkJoin, Subject, merge, of, defer, concat, throwError} = Rx;
let {ajax} = Rx.ajax;
let {map, filter, tap, takeLast, scan, startWith, mergeMap, finalize, ignoreElements} = Rx.operators;
console.clear();

function forkJoinWithProgress(arrayOfObservables) {

   return defer(() => {
   let counter = 0;
   const percent$ = new Subject();

   const modilefiedObservablesList = arrayOfObservables.map(
       (item, index) => item.pipe(
         finalize(() => {
           const percentValue = ++counter * 100 /  arrayOfObservables.length;
           percent$.next(percentValue);
         })
       )
   );

   const finalResult$ = forkJoin(modilefiedObservablesList).pipe(
     tap(() => {
       percent$.next(100);
       percent$.complete();
     }
   ));

   return of([finalResult$, percent$.asObservable()]);
 })

}

const getUserDetails = userIdsList => {

  const arrayOfObservables = userIdsList.map((userId, index) =>{
    //if (index === 1) return throwError({message: 'Vah-vah!'}); // testin with error

    return ajax('https://jsonplaceholder.typicode.com/comments/' + userId)
  }
  )

  return forkJoinWithProgress(arrayOfObservables)
}


const result$ = getUserDetails([1, 2, 15]);

result$.pipe(
  mergeMap(([finalResult, progress]) => merge(
    progress.pipe(
      tap((value) => console.log(`${value} completed`)),
      ignoreElements()
    ),
    finalResult
  ))
).subscribe(values => console.log(values), console.warn);

person Nithin    schedule 06.01.2020    source источник


Ответы (1)


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

forkJoin будет ждать завершения всех переданных Observables, а затем выдаст массив с последними значениями из соответствующих Observables. Итак, если вы передадите n Observable оператору, результирующий массив будет иметь n значений, где первое значение - это последнее, что испускает первый Observable, второе значение - последнее, что испускает второй Observable, и так далее.

Полная информация: Документы и полезная Средняя статья

Итак, в вашем примере порядок, в котором вы перебираете эти идентификаторы пользователя, будет порядком наблюдаемых, которые вы получите.

person MadaManu    schedule 06.01.2020