说我有这个功能:
function testAjax(url) {
return $.ajax({
url: url,
type: 'GET'
});
}
现在我有许多节点(我正在使用D3),我希望循环播放。每个人可能有也可能没有关联的文件。要查明是否存在,我会在所选节点上获取URL,检查返回的数据,如果它有文件/文件,我将其添加到文件数组中。然后,我希望仅在完成每个节点并检查它是否有文件后才记录文件数组。
其余代码与此类似:
var allFiles = [];
nodes.each(function(d) {
testAjax(d.url)
.success(function(data) {
if (data.files) {
if (data.files.length > 0) {
for (var i = 0; i < data.files.length; i++) {
allFiles.push(data.files[i])
}
}
}
})
})
//Here is where I want to log/use (call a function passing the files array as an argument) the array of files after its been completed.
答案 0 :(得分:3)
创建承诺数组并在解析完整数组时使用$.when()
来解析
var allFiles = [];
var promises = [];
nodes.each(function(d) {
// reference to promise
var req= testAjax(d.url)
.success(function(data) {
if (data.files) {
if (data.files.length > 0) {
for (var i = 0; i < data.files.length; i++) {
allFiles.push(data.files[i])
}
}
}
})
});
// push to array
promises.push(req);
});
$.when.apply(null, promises).then(function(){
// all promises have been resolved here
}).fail(function(){
alert('Opps ... something went wrong with one of the requests')
})
答案 1 :(得分:0)
您可以使用成功回调中的检查来查看您是否已到达nodes
数组的末尾:
var allFiles = [];
nodes.each(function(i, d) {
testAjax(d.url)
.success(function(data) {
if (data.files) {
if (data.files.length > 0) {
for (var i = 0; i < data.files.length; i++) {
allFiles.push(data.files[i])
}
}
}
// Check if the length-1 is equal to the index
if (i == nodes.length-1) doneLooping();
})
})
doneLooping()
应该在最后一次回调完成时调用。
Here是.each()
函数的有用页面。
答案 2 :(得分:0)
请尝试类似
的内容var allFiles = [];
var totalNodes = 0,
totalSuccessResponses = 0;
nodes.each(function(d) {
totalNodes++;
testAjax(d.url)
.success(function(data) {
totalSuccessResponses++;
if (data.files) {
if (data.files.length > 0) {
for (var i = 0; i < data.files.length; i++) {
allFiles.push(data.files[i])
}
}
}
if(totalNodes == totalSuccessResponses) {
// callback function()
// is excuted after all success responses received
}
})
})
答案 3 :(得分:0)
我会使用$.when,以确保在执行任何治疗之前所有承诺都已得到解决。
以下是一个示例(与您的代码没有直接关系,但使用模拟调用):
var test = function (i) {
var result = $.Deferred();
setTimeout(function () {
console.log(i + ": done");
result.resolve(i);
}, 1000 + Math.floor(Math.random() * 2000));
return result;
};
// with apply to allow the possible usage of $.map on an array of objects, and $.then on each promises
$.when.apply($, [test(1), test(2), test(3)]).done(function (i1, i2, i3) {
console.log(i1 + " " + i2 + " " + i3 + " are done");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
结合使用