Подписаться на наблюдаемый внутри цикла в Angular - PullRequest
0 голосов
/ 04 октября 2018

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

  getTasks(taskType: Observable<any>): void {
    taskType // Subscribing to the first Observable
      .subscribe(
        (tasks: any) => {
          let row: InboxTasks;
          for (const task of tasks) { // Looping through the result
            if (task.assigned_id) { // I need to extract that data in order to use it as an argument of the second Observable below
              this.auth.getUserById(task.assigned_id).subscribe((user) => this.username = `${user.firstname} ${user.lastname}`);
            }
            row = {
              assigned: this.username ? this.username : '', // Here I use my newly created property
              task: task.displayName
            };
            this.rowData = [
              ...this.rowData,
              row
            ];
          }
        }
      );
  }

Используя этот метод, цикл может быть выполнен до того, как вторая Observable может быть завершена.Как я могу использовать этот второй Observable в этом сценарии?

Спасибо

1 Ответ

0 голосов
/ 04 октября 2018

Вы можете сначала собрать все внутренние Наблюдаемые на основе ответа от первой Наблюдаемой и подождать, пока все они завершатся с forkJoin:

taskType
  .pipe(
    concatMap(tasks => {
      const observables = [];
      for (const task of tasks) {
        observables.push(this.auth.getUserById(task.assigned_id));
      }
      return forkJoin(...observables).pipe(
        map(innerResults => ({
          innerResults,
          tasks
        }))
      );
    })
  )
  .subscribe(({ innerResults, tasks }) => ...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...