【问题标题】:How to use observable subscription in forloop angular 7如何在 for loop angular 7 中使用可观察订阅
【发布时间】:2019-04-08 18:41:40
【问题描述】:

我有一个数组用户:

[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 中需要这些详细信息,即在调用 subscribe 我分配 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 answercodereview question 用于方法 2

【问题讨论】:

    标签: angular angular7 angular-observable


    【解决方案1】:

    forkJoin 仅在传入的所有 Observable 完成时发出一次。它发出一个数组,其元素是每个 Observable 在完成之前发出的值的结果。发出的 Array 的一个关键特征是元素的序列与构造 forkJoin 时传递的 Observable 的序列相同(类似于 Promise.all())。这很适合您手头的问题。 您可以遍历 forkJoin 的结果,并为每个 index 从 users Array 中选择相应的元素并将用户属性分配给结果对象。 虽然这可以直接在上面方法 2 的订阅调用中完成。更好的解决方案是将此代码移动到使用 Observable.create 方法创建的新 Observable 中。这将阻止您在订阅 forkJoin(ed) Observable 的任何地方编写迭代逻辑。我在这个 stackblitz demo here 中重新创建了相同的场景。检查控制台以获得所需的输出。

    【讨论】:

    • 非常感谢您的回答和演示。尝试您的解决方案后将接受您的答案。我认为这是我需要的。
    • 非常不错的Demo,如果你觉得可以的话我会fork它
    • @Gabriel Lopez 肯定:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多