2012-01-24 41 views
5

我有這樣的事情:如何知道最後的異步完成時間?

for (var i=0;i<result.qry.ROWCOUNT;i++) { 
    myAsync(i); 
} 

我怎麼知道什麼時候我所有的異步函數執行完畢?

如果有人回答「需要更多jQuery!」,我可以使用jQuery承諾對象嗎?或推遲或類似的東西?

+0

使用jQuery你可以用'.done()'或'。那麼()'和'$。當(合併)':HTTP ://stackoverflow.com/a/5817886/1095206 – BartekR

+0

非常感謝。這是我一直在尋找的東西! –

回答

1

在jQuery中,有最後一個Ajax運行後運行的$.ajaxStop函數。

7

跟蹤有多少異步調用未完成。當每個完成時,減少你的櫃檯。當你達到0時,你處於最後一次回調。

var asyncsLeft = 0; 
for (var i=0;i<10;++i){ 
    asyncsLeft++; 
    doSomethingAsyncWithCallback(function(){ 
    // This should be called when each asynchronous item is complete 
    if (--asyncsLeft==0){ 
     // This is the last one! 
    } 
    }); 
} 

是因爲JavaScript的單線程性質存在這樣的情況之前,所有的異步調用已排隊,你可能會得到您的回調調用沒有潛在的競爭狀態。如果您願意,可以在doSomethingAsynchronous之後撥打asyncsLeft++電話。

+1

我建議類似的東西:使用兩個變量,一個用於分配資源總數,另一個用於跟蹤已加載/失敗的數量(可能還有兩個其他變量)。只要有一個變量,你就有可能在代碼創建一個新的請求之前完成一個請求,而這個請求會過早地假設所有的東西都被加載(是的,這實際上發生在我身上)。另外,使用兩個變量可以顯示加載資源的進度。 –

+0

@JeffreySweeney如果你在一個循環中全部踢掉它們,那麼不,你不會冒這個風險。這就是我斜體文字的意思。直到'for'循環完成後纔會開始調用回調。 – Phrogz

-2

使用一個回調函數:

for (var i=0;i<result.qry.ROWCOUNT;i++) { 
    myAsync(i, myCallback); 
} 

function myCallback(i){ 
    //set result.qry.ROWCOUNT to a var somewhere above if it's not available in this scope 
    if(i == (result.qry.ROWCOUNT - 1)){ 
    //now you know you're actually done with all requests 
    } 
} 
function myAsync(i,callback){ 
    ///do work 
    callback(i); 
} 
+1

這隻有在異步任務按照它們開始的順序完成時纔有效。 –

+0

在這種情況下,'myAsync'是同步的,您必須將回調傳遞給您正在使用的任何異步方法/庫。 –

+0

優點 –

1

如果你使用jQuery,您還可以使用ajaxSendajaxComplete方法,讓您的計數器代碼從代碼派遣獨立。

var ajaxPending = 0; 

function ajax_changed(indicator, pending) { 
    if (pending) 
     $(indicator).show(); 
    else 
     $(indicator).hide(); 
} 

$('#loading-indicator').ajaxSend(function() { 
    ajax_changed(this, ++ajaxPending); 
}); 

$('#loading-indicator').ajaxComplete(function() { 
    ajax_changed(this, --ajaxPending); 
}); 
2

這是我會怎麼做:

//Do stuff up here to get records 
var rowCount = result.qry.ROWCOUNT, //Save the row count 
    asyncCount = 0, //The count of complete async calls 
    asyncCallback = function() { 
     //To be called whenever an async operation finishes 
     asyncCount++; //Increment the row counter 
     if (asyncCount >= rowCount) { 
      //Do stuff when they're all finished 
     } 
    }; 

for (var i=0;i<rowCount;i++) { 
    myAsync(i, asyncCallback); 
} 

function myAsync(index, completeCallback) { 
    //Do async stuff with index 
    //Call completeCallback when async stuff has finished or pass it 
    // into the async function to be called 
} 
相關問題