【问题标题】:Calling two services one after another in Angular using Observables使用 Observables 在 Angular 中依次调用两个服务
【发布时间】:2019-08-13 00:40:25
【问题描述】:

我试图在 Angular 中调用 ngOnInit 上的两个服务我有以下代码:

.ts 文件

ngOnInit() {
    // Calling 1st service
    this.serviceOne.getAllServiceOneData().subscribe(
      data => (
        this.serviceOneData = data,
        console.log('successfully loaded all service one data')
      ),
      error => this.errorMessage =   error as any,
    );

    //Trying to call 2nd service
    if (this.serviceOneData.length > 0) {
      this.serviceOneData.forEach(so => {
        this.serviceTwo.getAllServiceTwoData(so.id.toString()).subscribe(
          data => (
            this.serviceTwoData= data,
            console.log('successfully loaded service two related data')
          ),
          error => this.errorMessage =   error as any,
        );
      });  //forEach
    }  //if
}

现在,我想订阅第二个服务并获取在第一个服务上获取的每个项目的相关信息。

在 Angular 中使用 observable 是否可行?顺便说一句,我正在使用 Angular 7。

【问题讨论】:

    标签: angular rxjs angular-services


    【解决方案1】:

    您应该像这样使用switchMapforkJoin(请参阅 cmets 的解释):

    this.serviceOne.getAllServiceOneData()
            .pipe(
              //Use switchMap to call another API(s)
              switchMap((dataFromServiceOne) => {
                //Lets map so to an observable of API call
                const allObs$ = dataFromServiceOne.map(so => this.serviceTwo.getAllServiceTwoData(so.id.toString()));
    
                //forkJoin will wait for the response to come for all of the observables
                return forkJoin(allObs$);
              })
            ).subscribe((forkJoinResponse) => {
              //forkJoinResponse will be an array of responses for each of the this.serviceTwo.getAllServiceTwoData CALL
              //Do whatever you want to do with this array
              console.log(forkJoinResponse);
            });
    

    您也可以使用concat 而不是forkJoin,具体取决于您的应用需求。

    希望对你有帮助。

    【讨论】:

    • 为什么要使用switchMap?不会取消第一次通话吗??
    • 为什么会有地图???天哪,太混乱了
    • @user1034912 switchMap 尊重最近的 observable。如果一个 observable 正在进行中,同时另一个值通过管道传递到 observable 链中,则 switchMap 将使用最新的。这是switchMap的本质。如果要处理所有值,则可以使用 mergeMap。
    • @user1034912 在上面的示例代码中,map 是一个常规数组方法。虽然 RXJS 中也有 map 运算符。
    猜你喜欢
    • 2019-11-16
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多