我在嵌套两个服务时遇到问题

时间:2019-09-13 07:12:38

标签: angular callback rxjs angular2-observables rxjs-observables

第一个返回对象数组。每个对象都有一个唯一的用户ID,我需要该用户ID才能调用第二个服务。

this._vendorService.getAllPickupLoc().subscribe(val => {
  val.forEach(element => {
    this.finalObject = element;
    this._vendorService.getVendorUserInfo(element.id).subscribe(res => {
      this.finalObject["userInfo"] = res;
      this.finalArray.push(this.finalObject);
    });
  });
});

虽然工作正常,但是上面的代码有两个缺点。 1.开始看起来像是回调地狱。 2.我必须自己处理所有订阅。

1 个答案:

答案 0 :(得分:1)

您可以使用RxJS运算符将它们链接在一起:

this._vendorService.getAllPickupLoc().pipe(
  // emit each element in order
  mergeMap(elements => from(elements)),
  // subscribe to inner Observable for each element and emit result
  mergeMap(element => this._vendorService.getVendorUserInfo(element.id)),
  // handle info
  tap(userInfo => {
    this.finalObject["userInfo"] = res;
    this.finalArray.push(this.finalObject);
  })
).subscribe();

根据其余代码的结构,您甚至可以摆脱tap并简单地map每次发射,并添加toArray以将最终结果作为数组发射