在我的应用中,在开始创建一些对象之前,我需要进行许多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);
}
);
这是正确/最佳方法吗?
答案 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])