2016-05-27 36 views
-1

我有這樣的一個Ajax功能JQuery的每個不等待函數中完成

$.each(data['Result'][0], function(Key, Value) { 
    InputGen(Value['Type'], Value['Name'], Value['Other'], Value['Value'], function(Html){ 
     Table = Table + "<tr><td>"+Key+"</td><td>" + Html + "</td></tr>"; 
    }); 
}); 

InputGen內部有從另一個AJAX功能的回調,但是當我運行這個循環似乎並沒有被等待阿賈克斯完成。我將如何實現這一目標?

+0

你需要某種隊列或承諾系統。 –

+1

AJAX是*異步*。沒有什麼會等待它完成。回調將在通話結束後的某個時間點運行。那時你的'$ .each'(和後面的代碼)很長時間了。 –

回答

2

這是因爲AJAX是異步。沒有什麼是等待它完成。回調將在通話結束後的某個時間點運行。那時你的$.each(和後面的代碼)很長時間了。

這裏的解決方案是使用承諾。這樣,你可以運行一次回調全部 AJAX調用完成。

爲此,您可以使用jQuery的$.Deferred。沒有編輯InputGen()函數,你可以這樣做:

var promises = []; 

$.each(data['Result'][0], function(Key, Value) { 
    var d = new $.Deferred; 

    InputGen(Value['Type'], Value['Name'], Value['Other'], Value['Value'], function(Html){ 
     d.resolve([Key, Html]); 
    }); 

    promises.push(d.promise()); 
}); 

$.when.apply($, promises).done(function(){ 
    for(var i=0, length=arguments.length; i < length; i++){ 
     var ele = arguments[i], 
      Key = ele[0], 
      Html = ele[1]; 

     Table = Table + "<tr><td>"+Key+"</td><td>" + Html + "</td></tr>"; 
    } 

    // In here is where you can use your updated `Table` variable. 
    // You *cannot* use it outside of here, since it was not updated yet 
}); 
+1

我喜歡這個解決方案,因爲它可以讓ajax調用重疊。 –

2

...循環似乎沒有在等待ajax完成。

不,因爲「ajax」中的「a」代表異步;當你打電話時它不會發生,它會在稍後發生。但是沒有任何理由可以坐下來等待它完成。

如果你不需要它(例如,ajax調用重疊,這通常應該是除非他們互相依賴),look at Rocket Hazmat's approach

如果您需要每個ajax調用來等待前一個ajax調用完成,您不能使用$.each(或至少,而不是你的方式);相反,使用索引並觸發下一個請求回調回應:

// Start with first entry 
var index = 0; 
var array = data['Result'][0]; 

// Do the first request 
doRequest(); 

function doRequest() { 
    var value = array[index]; 
    InputGen(value['Type'], value['Name'], value['Other'], value['Value'], function(Html) { 
     Table = Table + "<tr><td>"+index+"</td><td>" + Html + "</td></tr>"; 
     // This request is done, move to the next if any 
     if (++index < array.length) { 
      doRequest(); 
     } 
    }); 
} 

邊注:絕大多數時候在JavaScript中,變量和非構造函數的命名開始用小寫字母:value而不是Value等,所以我使用index,arrayvalue以上。

附註2:value['Type]可以更簡單地寫爲value.Type。 (以此類推)。