每个

时间:2017-01-03 16:28:32

标签: angular asynchronous typescript foreach

我正在为角度为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()之前处理异步数据?这有效,但似乎效率低下且杂乱

1 个答案:

答案 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