【发布时间】:2014-11-23 02:17:26
【问题描述】:
我已经解决了这个问题。
Are recursive AJAX calls a bad idea?
Justin Niessner 提供的答案很好(通过使用承诺)但我的问题有点不同。
我想递归调用10 ajax calls。就像第一个 ajax 调用完成时一样,我在视图中呈现该数据(由 ajax 调用提供),同时我将调用第二个 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。
- 编辑 - 根据 cmets 改进:
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); }
【问题讨论】:
-
既然你没有发送任何数据,那么首先需要嵌套调用的原因是什么?如果只是为了让它们保持秩序,可以早点发送并使用承诺保持秩序
-
如果你只是保持数据去哪里的顺序,你可以在一个简单的循环中调用所有的ajax函数,浏览器会将它们排队,但它们当然不会按顺序完成,你'必须自己保持这个顺序,但这很容易,即使没有承诺,只需将索引传递给
renderData函数以了解完成的请求等。 -
@charlietfl 抱歉我的错误,编辑了问题。
-
仍然没有解释为什么你不能简单地创建一个 url 的数组并循环数组。
-
@charlietfl 正如你所说,我包含了代码。我很想知道在这种情况下这是最好的解决方案吗?或者我可以改进它?
标签: javascript jquery ajax recursion promise