Как использовать наблюдаемую подписку в forloop angular 7 - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть массив пользователей:

[0: {id:123, firstname:'xyz', lastname:'abc'}, 1:{id:456, firstname:'foo', lastname:'bar'}, 3:{id:567, firstname:'bar', lastname:'baz'}]

Я должен пройти через этот массив и вызвать сервисный API для получения пользовательских назначений.

Метод 1 , который, на мой взгляд, не является лучшей практикой, но решает проблему

let userAppointments = []
  for (let user of this.users) {

    this._service
      .getUsersAppointments(
        {
          date: this.todayDate,
          id: user.id
        },
        this.token
      )
      .subscribe(res => {

       // Modifying array as per requirements-----

        userAppointments.push({
          id: user.id,
          name: `${user.firstname} ${user.lastname}`,
          appointments: res
        });
      });

  }

  this.appointments = userAppointments 

метод 2: с использованием forkJoin

Проблема: я не могу получить доступ к имени и фамилии пользователя, когда наконец получаю ответ от всех вызовов. Мне нужны эти детали в моем окончательном массиве this.appointments, т.е. после вызова подписки, где я назначаю res to this.appointments

        forkJoin(
    this.users
      .map(res =>
        this._service.getUsersAppointments(
          {
          date: this.todayDate,
          id: res.id

          },
          this.token
        )
      )
      .map(response => response)
  ).subscribe(res => {

    // how can I access 'user object' keys like: firstname, id here--------------

    this.appointments = res;

  });

Пожалуйста, дайте мне знать, если моя проблема не ясна.

Направлено SO ответ и Вопрос повторного просмотра кода для метода 2

1 Ответ

0 голосов
/ 11 ноября 2018

forkJoin испускается только один раз, когда все Наблюдаемые, переданные в него, завершаются. Он испускает Массив, элементами которого являются результаты значений, излучаемых каждым Наблюдаемым до его завершения. Ключевой характеристикой испускаемого массива является то, что последовательность элементов такая же, как последовательность наблюдаемых, передаваемых при создании forkJoin (аналогично Promise.all ()). Это хорошо подходит для решения проблемы, с которой вы столкнулись. Вы можете перебрать результаты из forkJoin, и для каждого индекса выбрать соответствующий элемент из массива users и назначить пользовательские свойства объекту result. Хотя это можно сделать прямо в вызове подписки в вашем методе 2 выше. Лучшим решением было бы переместить этот код в новый Observable, созданный с использованием метода Observable.create. Это не позволит вам писать логику итерации везде, где вы подписываетесь на forkJoin (ed) Observable. Я воссоздал тот же сценарий в этом демонстрационном стеке здесь . Проверьте консоль для желаемого выхода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...