2017-01-03 8 views
3

Я делаю вызов 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(); 
     }); 
} 

Ref: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/forkjoin.md

+0

Спасибо! Это отлично сработало – Bhetzie

+0

@Bhetzie Glad Я мог бы помочь! – echonax

Смежные вопросы