2017-05-30 198 views
2

我有,我想要做的事,一旦10異步調用已完成如何檢查多個異步操作是否已完成?

let i = 0; 
let array = []; 

do { 
    this.service.getSomething(i).subscribe(response => { 
    array[i] = response; 
    }); 
} while (i < 10); 

// how can I know when the 10 async calls have completed? 

我怎樣才能做到這一點的情況下?

+0

你能把你的問題標記爲'javascript'嗎? – trincot

回答

0

您必須使循環異步,以便只有當下一個響應可用時纔會發生迭代。這裏是你如何能做到這一點:

(function loop(arr) { 
    if (arr.length >= 10) return alldone(array); // all done 
    this.service.getSomething(arr.length).subsribe(response => { 
     loop(array.concat(response)); // "recursive" call 
    }); 
})([]); // <--- pass empty array as argument to the loop function 

function alldone(arr) { 
    console.log(arr); 
} 

loop功能立即用一個空數組作爲參數調用。當你得到響應時,你再次調用該函數,現在使用擴展數組,......等。一旦你有10個響應,你可以調用另一個函數來處理最後一個數組。

正如你所看到的,我選擇消除變量i,因爲arr.length具有相同的值。

請注意,這種異步處理也可以通過承諾以及asyncawait等一些最新功能來完成。你可能想看看。 Here is an example

1

「在RX方式」是使用forkJoin

const requestParams = [0,1,2,3,4,5,6,7,8,9]; 
const requests = requestParams.map(i => this.service.getSomething(i)); 
Observable.forkJoin(requests).subscribe(reponseArray => alldone(responseArray)); 
2

這取決於你是否知道異步操作(讀觀測量/承諾)事先與否。

例如,如果你可以撰寫觀測量的一個數組,那麼最簡單的方法是使用forkJoin

let observables = [ ... ]; 
Observable.forkJoin(observables) 
    .subscribe(results => /* whatever */); 

否則,你可以mergeMap成一個單一的鏈只能聽complete信號:

Observable.range(1, 10) // or whatever 
    .mergeMap(i => /* return Observable here */) 
    .subscribe(undefined, undefined,() => console.log('all done')); 
0

您可以僅計算單獨的變量的反應,和前檢查它繼續:

let i = 0; 
let array = []; 
var finishedCnt=0; 
do { 
    this.service.getSomething(i).subsribe(response => { 
    array[i] = response; 
    finishedCnt++; 
    if(finishedCnt>=10) { 
     // all requests done, do something here 
    } 
    }); 
} while (i < 10); 
相關問題