sxenguri
@sxenguri

Как правильно работать с массивами в RxJs?

packages.forEach((pack) => {
    this.packageService.getPackage(pack.id)
      .pipe(takeUntil(this.ngUnsubscribe))
      .subscribe((newPack: Package) => {
        this.verbosePackages.push(newPack);
        this.sharedPackagesService.updatePackages(this.verbosePackages);
      })
  }


getParameters(): void {
    this.verbosePackages.forEach((pack) => {
      this.packageParameters = this.packageParameters.concat(pack.packageParameters);
    })
    this.getParameterVisibilities();
  }


У меня есть две такие функции.
Как мне сделать так, чтобы функция getParameters() запускалась только после того, как в первой функции в цикле каждый элемент массива сделал запрос к серверу, получил от него ответ и добавил этот ответ в массив verbosePackages?
Можно, конечно, написать костыль, который перед запуском функции getParameters() будет сверять длину массивов packages и verbosePackages, но это явно очень плохое решение.
В целом у меня много подобных ситуаций, когда мне нужно работать с каким-то массивом, но я не знаю, пришли ли в него все необходимые данные с бекенда. Какие существуют решения, чтобы вызывать какой-то триггер, который будет уведомлять о том, что все запросы к базе данных были выполнены?
  • Вопрос задан
  • 545 просмотров
Решения вопроса 2
Xuxicheta
@Xuxicheta Куратор тега Angular
инженер
getParameters(ids: (string|number)[]): Observable<MyResult[]> {
  return forkJoin(ids => ids.map(id => this.packageService.getPackage(id)))
}


Типичный параллельный запрос с получением пачки результатов.
Подписка со складыванием результатов в массив не нужна, промисы вообще не нужно никуда тащить, сразу шли в игнор странных чуваков с промисами и прорвой бессмысленного кода :)
Внутри this.packageService.getPackage возможно придется сделать обработку ошибки, т.к. если в forkJoin попадет ошибка, то сломается вся пачка, ну так же как и в случае Promise.all.
Ответ написан
GlazOtca
@GlazOtca
Не в бровь, а в глаз!
Promise.all() вам в помощь
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы