我正在为角度为2的每个循环进行api调用。一旦完成所有调用,我想调用另一个通过路由器重定向用户的函数。
这是我到目前为止所做的:
processData(){
var itemsToMove = this.myArray.length;
this.myArray.forEach((item:any, index:any) => {
let urlSearchParams = new URLSearchParams();
//code that sets up my urlSearchParam
let body = urlSearchParams.toString();
itemsToMove--;
this.putService.putObjectWithBody("myapicall", body).subscribe(data => {
if (itemsToMove === 0) {
this.redirect();
}
});
}
}
有没有更好的方法可以确保在调用this.redirect()
之前处理异步数据?这有效,但似乎效率低下且杂乱
答案 0 :(得分:4)
您可以在这种情况下使用forkJoin
;它在进入回调之前并行运行所有可观察序列。因此,您需要一组可观察的数据。
processData(){
var observableArray:any = [];
this.myArray.forEach((item:any, index:any) => {
let urlSearchParams = new URLSearchParams();
//code that sets up my urlSearchParam
let body = urlSearchParams.toString();
observableArray.push( this.putService.putObjectWithBody("myapicall", body) );
}
Observable.forkJoin(observableArray)
.subscribe(data => {
//this.myFunction(data[0], data[1]...);
this.redirect();
});
}
参考:https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/forkjoin.md