如何等待不同的http请求接收响应(建议)

时间:2019-07-04 09:54:02

标签: angular rxjs angular-httpclient

在我的应用中,在开始创建一些对象之前,我需要进行许多http调用... 因此,只有当所有http请求都已从服务器接收到结果时,我才能处理所有结果并构建我的页面...

要完成此操作,我已经使用forkJoin实现了这样的方法:

    let req1 = this.http.get<MyObject>('http:/whatever/getData1');
    let req2 = this.http.get<MyObject>('http:/whatever/getData2');
    let req3 = this.http.get<MyObject>('http:/whatever/getData3');
    let req4 = this.http.get<MyObject>('http:/whatever/getData4');

    this.searchSubscription = forkJoin([Observable.of(new Object()), req1,req2,req3,req4]).subscribe(
        results => {
            console.log("data loaded let's start...");
        },
        err =>{
            console.log("Something went worg:" + err);
        }
    );

这是正确/最佳方法吗?

2 个答案:

答案 0 :(得分:0)

我认为这不是最好的方法,因为在可观察的用例中,您将为每个订阅打开一个事件侦听器,如果使用forkjoin进行操作,则您将无法关闭所有订阅销毁您的组件,因此,如果我可能会说您应该选择更好的解决方案,例如在服务的方法中设计可观察对象,然后将其一一调用,这样您将在请求中拥有更多的可见性和准确性,或者只是通过后端路由一次将所有这些请求中的数据提供给您

答案 1 :(得分:0)

对我来说,最好的方法是将可观察值转换为Promise.all,并使用Promise.all。

  let req1 = this.http.get<MyObject>('http:/whatever/getData1').toPromise();
    let req2 = this.http.get<MyObject>('http:/whatever/getData2').toPromise();
    let req3 = this.http.get<MyObject>('http:/whatever/getData3').toPromise();
    let req4 = this.http.get<MyObject>('http:/whatever/getData4').toPromise();

 const [res1,res2,res3,res4] = await Promise.all([req1,req2,req3,req4])