Запросы RxJs в цикле

У меня есть список параметров и по каждому параметру на сервер отправляется запрос. Количество параметров может варьироваться, поэтому запросы отправляются циклично. Вопрос в том, как мне отправить запросы по всем параметрам, дождаться ответа от всех запросов и продолжить выполнение программы. Для этого вам нужно использовать RxJS.

  private getValuesForEditTariff(parameter: Parameter) {

    if (parameter.dependParams != null && parameter.dependParams.length > 0) {

      let pars: Parameter[] = new Array<Parameter>();
      this.actionEditTariff.groups.forEach(group => {
        pars = pars.concat(group.parameters);
      });

      let locator = (p: Parameter, id: number) => p.id == id;

      let service = this.actionService;
      let action = this.actionEditTariff;

      parameter.dependParams.forEach(parameter => {

        let par = pars.find(p => locator(p, parameter));
        if (par) {

          par.loading = true;

          service.getValues(parameter, pars,action.action, action.actionScheme).subscribe({
            next: (data) => {
              par.values = data;
              par.loading = false;
              console.info("Значения получены");
            },
            error: (error)=> {
              this.message = error.error.message || error.statusText;
              par.loading = false;
              this.showError();
            }
          })
        }
      })
    }
  }

Я пытался использовать concatMap, но не понимаю, как он работает.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать forkJoin, чтобы дождаться всех подобных ответов.

private getValuesForEditTariff(parameter: Parameter) {
  if (parameter.dependParams != null && parameter.dependParams.length > 0) {
    let pars: Parameter[] = new Array<Parameter>();

    this.actionEditTariff.groups.forEach(group => {
      pars = pars.concat(group.parameters);
    });

    const locator = (p: Parameter, id: number) => p.id == id;

    const service = this.actionService;
    const action = this.actionEditTariff;

    const parameters$ = parameter.dependParams.reduce((parameters, parameter) => {
      const par = pars.find(p => locator(p, parameter));

      if (par) {
        par.loading = true;

        parameters.push(
          service.getValues(parameter, pars, action.action, action.actionScheme).pipe(
            tap(() => {
              par.values = data;
              par.loading = false;
              console.info('Значения получены');
            }),
            catchError(() => {
              this.message = error.error.message || error.statusText;
              par.loading = false;
              this.showError();

              return of(null);
            }),
          ),
        );
      }

      return parameters;
    }, []);

    forkJoin(parameters$).subscribe();
  }
}

Спасибо большое, а что такое переменные «параметры»? Это массив? Не могу найти декларацию об этом

denikotin 27.02.2024 11:32

@denikotin это первый параметр, передаваемый в обратный вызов метода уменьшения массива, вы можете проверить его здесь Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

Ali Ataf 27.02.2024 12:23

Хорошо, не могли бы вы объяснить, почему вы используете здесь сокращение, пожалуйста. И как вы делаете параметры.push(), если параметры — это числовой тип

denikotin 27.02.2024 12:27

@denikotin Цель состоит в том, чтобы получить массив наблюдаемых для передачи в forkJoin, поэтому я использовал reduce, потому что вы фильтруете по условию if (par) перед отправкой запроса, поэтому вы можете использовать .reduce() или .filter().map(), чтобы получить желаемый массив, поэтому reduce подойдет 1 цикл по массиву вместо 2, и parameters — это не число, это массив, в который будут отправлены запросы.

Ali Ataf 27.02.2024 12:45

Я получил ошибку, что параметры не являются массивом и не могут выполнить push(). Но в любом случае огромное спасибо, для меня это очень полезно, ценю это.

denikotin 27.02.2024 13:13

@denikotin, пожалуйста, повтори попытку, я обновил свой ответ

Ali Ataf 27.02.2024 14:49

Другие вопросы по теме