2017-01-03 6 views
3

각도 2의 각 루프에 대해 api 호출을합니다. 모든 호출이 이루어지면 라우터를 통해 사용자를 리디렉션하는 다른 함수를 호출하려고합니다.각 2 이후의 각도 2 호출 함수

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()를 호출하기 전에 처리되도록 할 수있는 더 좋은 방법이 있나요 :

이것은 내가 지금까지 가지고 무엇인가? 이 작동하지만 비효율적이고 지저분 해 보입니다.

답변

3

이 상황에서는 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

+0

감사합니다! 이것은 완벽하게 작동했습니다. – Bhetzie

+0

@Bhetzie Glad 제가 도울 수있었습니다! – echonax