角度2:处理两个并行的Web服务调用

时间:2019-01-30 03:26:22

标签: javascript angular promise

我有两个并行的Web服务调用。有时,我的第一个服务呼叫呼叫第一个,有时呼叫第二个。我的第二个服务有一个功能,但是该功能需要我的第一个服务调用数据。

我尝试执行一个if语句,就像firstData存在一样,然后调用其他服务。但是没用

this.service.getFirstData(reqParams).then((data: any) => {
                        if (data.response) {
                            this.firstData = data.response;
                        }
                    }).catch(err => {
                            console.log(err);
                    });
this.service.getSecondData(data.user, this.itemselected).then((data: any) => {
                            if (data) {
                                this.listData = data.response.list;
                                this.calculateData();
                            }
                        }).catch((err: any) => {
                                console.log(err)
                        });

服务是异步的。我该如何处理这种奇怪的行为?预先感谢

3 个答案:

答案 0 :(得分:0)

如果您使用的是Angular,则可以利用RxJS的mergeMap来处理。

this.service.getFirstData(reqParams).pipe(
  mergeMap(res => { 
    // console.log(res)
    return this.service.getSecondData(res.user, this.itemselected)
  })
).subscribe(res => {
  // do the rest
});

答案 1 :(得分:0)

您应该在第一个服务回调上调用第二个服务,因为第一个服务是异步的

   this.service.getFirstData(reqParams).then((data: any) => {
                            if (data.response) {
                                this.firstData = data.response;
//call your second service after the successful first service and then pass the data to the second service
                         this.service.getSecondData(data.user, 
                                     this.itemselected).then((data: any) => {
                                if (data) {
                                    this.listData = data.response.list;
                                    this.calculateData();
                                }
                            }).catch((err: any) => {
                                    console.log(err)
                            });
                          }
                        }).catch(err => {
                                console.log(err);
                        });

如果您想使用promise运行任何异步调用并行操作,如果它们不相互依赖,则可以尝试如下操作

Promise.all([promise1, promise2, promise3]).then(function(values) {
       console.log(values);
      //call if any other service after succesful execution of promise
});

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

答案 2 :(得分:0)

对我们来说幸运的是,有一种优雅的方法可以在Angular 2/4中执行多个HTTP请求并等待所有请求完成。让我们为这种情况编写一个代码示例。我们需要的只是两个类。 REST服务,其中封装了HTTP请求方法和需要使用后端数据的组件。

import {Component, OnInit} from '@angular/core';
import {RestService} from "../rest.service";
@Component({
    selector: 'app-demo',
    templateUrl: './demo.component.html',
    styleUrls: ['./demo.component.css']
})
export class DemoComponent implements OnInit {
    dataFromRequest1: any;  // data from url 1
    dataFromRequest2: any;  // data from url 2
    constructor(private restService: RestService) {
    }
    ngOnInit() {
        this.restService.getDataFromTwoResources().subscribe(responseList => {
            /*
            The response list is an array. In order to access data from each individual
            request, you need to use an index.
             */
            this.dataFromRequest1 = responseList[0];
            this.dataFromRequest2 = responseList[1];
        });
    }
}

注意:此技术可用于收集来自多个服务器或同一服务器的请求。您只需要知道资源的URL即可。