我已經經歷了這個問題。 Are recursive AJAX calls a bad idea? 賈斯汀尼斯納提供的答案很好(通過使用承諾)但我的問題有點不同。 我想遞歸調用10 ajax calls
。當第一個Ajax調用完成一樣,使我的數據,我認爲(通過Ajax調用提供),並在同一時間我會打電話給第二AJAX call.So我的代碼示例如下所示:遞歸地進行多個AJAX調用是個壞主意
(function() {
var downloadAsync = function(url, callback) {
var httpRequest;
if (window.XMLHttpRequest) {
httpRequest = new XMLHttpRequest();
} else if (window.ActiveXObject) {
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
httpRequest.onreadystatechange = function() {
if (httpRequest.readyState === 4 && httpRequest.status === 200) {
callback(httpRequest.responseText);
}
}
httpRequest.open("GET", url, true);
httpRequest.send();
}
function renderData(data) {
//data render logic
}
downloadAsync("mathmatics.json", function(response) {
renderData(response);
downloadAsync("science.json", function(response) {
renderData(response)
downloadAsync("english.json", function(response) {
renderData(response);
....................................
});
});
});
})();
我想盡可能快地呈現每個數據。所以每次調用Ajax時,我都會渲染這些數據。 這裏是我的問題:
有沒有更好的做到這一點?在這種情況下,我可以使用promises
嗎? (渲染數據 是必要儘快)。如果是的話,而不是如何以及如果不是,那麼做這種呼叫的最佳方式是什麼。
- 注意:在ajax成功上呈現數據是我的首要任務。
- 編輯 - 瀏覽器支持 - 最新的Chrome,Firefox和IE-11。
- 編輯 - 根據意見改進:
var array = ["mathematics.json", "science.json", "english.json"]; for (var i = 0; i < array.length; i++) { downloadAsync(array[i], renderData); } function renderData(data) { console.log(data); }
因爲你沒有發送任何數據,是什麼原因需要擺在首位的嵌套調用?如果只是爲了保持它們的順序,可以更快地發送它們,並使用承諾來保持順序 – charlietfl 2014-09-28 16:48:28
如果您只是保持數據所在的位置的順序,則可以在簡單的循環中調用所有的ajax函數,並且瀏覽器將排隊但它們當然不會按順序完成,你必須自己保留這個順序,但即使沒有承諾,也很容易,只需將一個索引傳遞給'renderData'函數來知道什麼請求已完成等。 – adeneo 2014-09-28 16:50:59
@charlietfl對不起我的錯誤,編輯了這個問題。 – Anshul 2014-09-28 16:51:46