Большое количество вызовов api с использованием flatMap в Angular

#angular #rxjs

#angular #rxjs

Вопрос:

Я выполняю массовую операцию, в которой мне нужно вызвать API GET и PUT для 400 различных значений. Я использую цикл for и flatMap для получения подробной информации о конкретной записи, а затем изменяю запись и вызываю update для этой записи. Код приведен ниже:

 for(let i=0; i<400; i  ) {
    const param1 = this.collectionArr[i].param1;
    this.myservice.api1(param1).pipe(takeUntil(this.destroyed$), finalize(() => {
        //do something after both api calls are completed
    },
    flatMap((result1) => {
        //do some operation and create object x(this.objx)
        return this.myservice.api2(param1, this.objx);
    })).subscribe((result2) => {
        //do something based on result2 and this.objx
    })
}
  

С этим кодом все работает нормально. Однако я заметил на вкладке Сеть в Chrome, что выполняемые запросы (api1 / api2) на некоторое время (от нескольких секунд до нескольких минут) приостанавливаются из-за ограничения Chrome на 6 tcp-подключений к origin одновременно. Это приводит к значительной задержке между операциями получения и обновления. Если кто-то другой тем временем выполняет операцию обновления, процесс завершается с ошибкой. Чтобы избежать этого, мне нужно убедиться, что вызов api2 не должен застопориться и должен вызываться сразу после получения ответа от api1. Есть ли способ сделать это?

Комментарии:

1. используйте concatMap для ожидания успеха api1 и после вызова api2

2. в конечном итоге вы можете использовать, mergeMap(project, N) где N — количество параллельных внутренних наблюдаемых (HTTP-запросы в вашем случае).