【问题标题】:Angular : Receive responses in order with the callsAngular:按调用顺序接收响应
【发布时间】:2018-05-16 17:44:47
【问题描述】:

您好,我对 Angular 和 Observables 很陌生

我正在尝试通过循环通过他们的 ID 获取对象。 但不要按顺序收到我的回复。

例子

get ID(1)
get ID(2)
get ID(3)
Receive Object ID(2)
Receive Object ID(3)
Receive Object ID(1)

是否有可能让我的对象恢复正常? 下面是我多次调用我的服务函数的地方:

conferences-attendance.component.ts

  ExportExcelAttendance() {
    for (var i = 0; i < this.contactsAttendance.length; i++) {
      this.practiceService.GetPracticebyDBID(this.contactsAttendance[i].practiceId)
        .subscribe(
        (practice: Practice) => {
          this.practicesAttendance.push(practice);
          if (this.practicesAttendance.length == this.contactsAttendance.length) {
            this.ExportExcelAttendance2();
          }
        },
        error => this.errorMessage = <any>error
        );
    }
  }

这是我在服务中的功能,我接收数据的地方(不是按调用顺序)。

practices.service.ts

    GetPracticebyDBID(id: string) {
        let params: URLSearchParams = new URLSearchParams();
        params.set('thisId', id);
        let requestOptions = new RequestOptions();
        requestOptions.params = params;
        return this.http.get('http://ec2-34-231-196-71.compute-1.amazonaws.com/getpractice', requestOptions)
            .map((response: Response) => {
                return response.json().obj;
            })
            .catch((error: Response) => Observable.throw(error.json()));
    }

【问题讨论】:

    标签: node.js angular rxjs observable subject


    【解决方案1】:

    您应该使用concatAll 运算符来确保按顺序调用您的可观察对象。

    另外,您可以使用completed 回调来调用ExportExcelAttendance2,而不是检查每个响应回调的practicesAttendance 长度。

    查看以下示例:

    let contactsAttendanceObservables = this.contactsAttendance
      .map((item) => {
        return this.practiceService.GetPracticebyDBID(item.practiceId);
      });
    Observable.of(...contactsAttendanceObservables)
      .concatAll()
      .subscribe(
        (practice: Practice) => {
          this.practicesAttendance.push(practice);
        },
        (err) => {
          // handle any errors.
        },
        () => {
          // completed
          this.ExportExcelAttendance2();
        }
      );
    

    如果你仍然希望你的 observables 并行运行,你可以使用 forkJoin 操作符,当所有 observables 完成时,它会将所有传递的 observables 的最后一个值发送给一个订阅者。

    查看以下示例:

    let contactsAttendanceObservables = this.contactsAttendance
      .map((item) => {
        return this.practiceService.GetPracticebyDBID(item.practiceId);
      });
    Observable.forkJoin(...contactsAttendanceObservables)
      .subscribe(
        (practices: Practice[]) => {
          this.practicesAttendance = practices;
          this.ExportExcelAttendance2();
        }
      );
    

    【讨论】:

    • 非常感谢!!什么意思...在 Observable.of(...contactsAttendanceObservables) 中。还有什么
    • 我在 [ts] 类型参数 '(已完成:任何 => void 不能分配给类型参数'() => void' 时出现错误。
    • 我的错,检查更新的答案,或使用 forkJoin 以获得更快的响应,因为它将允许 observables 并行执行。
    【解决方案2】:

    forkJoin operator 使用简单。它一直等到所有可观察对象完成,然后发出一个包含所有已发出项目的数组。

    ExportExcelAttendance() {
      const all = this.contactsAttendance.map(it => this.practiceService.GetPracticebyDBID(it.practiceId));
      Rx.Observable.forkJoin(all)
        .subscribe(
          practicesAttendance => this.ExportExcelAttendance2(practicesAttendance),
          error => this.errorMessage = < any > error);
    }

    【讨论】:

      【解决方案3】:

      forkJoin 给你的代码少一点,

      const arrayOfFetches = this.contactsAttendance
        .map(attendee => this.practiceService.GetPracticebyDBID(attendee.practiceId) );
      
      Observable.forkJoin(...arrayOfFetches)
        .subscribe((practices: Practice[]) => {
            this.practicesAttendance = practices;
            this.ExportExcelAttendance2();
        });
      

      编辑 折断! @Anas 打败了我。虽然,我认为你不需要concatAll()

      【讨论】:

      • 我同意,但决定也保留cocncatAll,有时您需要按顺序运行 API 调用。例如:注册然后登录。
      • @AnasAlHamdan - 好点!虽然,我指的是 forkJoin 之后的 concatAll,但您已将其删除(假设是复制粘贴)。
      • 你抓住了我:p
      猜你喜欢
      • 2014-08-11
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 2012-12-26
      相关资源
      最近更新 更多