【问题标题】:Subscribe to an observable within a loop in Angular在 Angular 的循环中订阅一个 observable
【发布时间】:2018-10-04 20:54:15
【问题描述】:

我有一个用例,我需要订阅 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

谢谢

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    您可以首先根据第一个 Observable 的响应收集所有内部 Observable,然后等待它们全部完成并使用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 }) => ...);
    

    【讨论】:

    • 谢谢,但是通过使用这个解决方案,订阅只会给我 getUserById Observable 的结果。我想要的是遍历任务并仅在 task.assigned_id 存在时订阅 getUserById 。然后 getUserById 的响应(以及第一个 Observable 的响应!)将允许我创建 row 对象。
    • 您可以将内部forkJoin 响应的结果映射到也包含第一个响应。查看我的更新。
    • 有时我的observables 数组没有长度,因为有时我的任务没有assigned_id(这是正常行为)。但是如果发生这种情况,那么subscribe 将不起作用,因为observables 是空的,因此forkJoin 不起作用(这是我的猜测)。即使observables 为空,我如何才能订阅?谢谢
    猜你喜欢
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 2019-06-28
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 2018-12-12
    相关资源
    最近更新 更多