我正在开发一个项目,在这个项目中我需要进行多个JSON调用。一旦我退出该循环,我需要处理我所做的所有调用的结果。我很难理解如何按照我的操作顺序来完成这些调用。在完成对服务的调用之前,始终执行处理结果的代码。我创建了一个jsfiddle来演示并在这里包含代码。
var sourceData = { "fooIndex": "foo",
"barIndex": "bar"
}
var destinationData = {};
for (var sourceIndex in sourceData) {
$.getJSON('http://echo.jsontest.com/' + sourceIndex + '/' + sourceData[sourceIndex] + '?callback=?', null, function (result) {
for (var resultIndex in result) {
alert("Adding " + resultIndex + " : " + result[resultIndex]);
destinationData[resultIndex] = result[resultIndex];
}
});
}
if (Object.keys(destinationData).length == 0) {
alert("Destination not yet populated");
}
else {
alert("Eureka! You did it!");
}
答案 0 :(得分:5)
这看起来像是jQuery Deferred Object和我的伙伴$.when
的工作!
将所有$.getJSON
来电转至$.when
,完成后,我将调用所有结果的函数。
检查出来:
var sourceData = {
"fooIndex": "foo",
"barIndex": "bar"
};
var destinationData = {};
// Array of AJAX calls
var AJAX = [];
for (var sourceIndex in sourceData) {
AJAX.push($.getJSON('http://echo.jsontest.com/' + sourceIndex + '/' + sourceData[sourceIndex] + '?callback=?'));
}
// Apply is needed to pass each element as a parameter
$.when.apply($, AJAX).done(function(){
// This function will be called when all the AJAX calls are done
// The arguments of the functin are the responses from each request
for(var i = 0, len = AJAX.length; i < len; i++){
var result = arguments[i][0];
//arguments: [resultObj, 'success', jqXHR]
for (var resultIndex in result) {
alert("Adding " + resultIndex + " : " + result[resultIndex]);
destinationData[resultIndex] = result[resultIndex];
}
}
alert("Eureka! You did it!");
});
注意:由于这是异步的,因此在触发回调之前,destinationData
将不可用。将任何使用的代码放在 .done()
回调中。
答案 1 :(得分:3)
由于您已经在使用jQuery,我建议您探索队列函数。您可以对ajax调用进行排队,然后在成功处理程序中调用de-queue或next函数。这样他们就会相继出现。添加到队列的最后一项是处理返回数据的函数。
var sourceData = {
"fooIndex": "foo",
"barIndex": "bar"
};
var destinationData = {};
$(function () {
console.debug('ready');
for (var sourceIndex in sourceData) {
console.debug('for Loop');
$(document).queue('ajax', function (next) {
$.getJSON('http://echo.jsontest.com/' + sourceIndex + '/' + sourceData[sourceIndex] + '?callback=?', null, function (result) {
for (var resultIndex in result) {
alert("Adding " + resultIndex + " : " + result[resultIndex]);
destinationData[resultIndex] = result[resultIndex];
next();
}
});
});
}
$(document).queue('ajax', function (next) {
alert("Eureka! You did it!");
});
$(document).dequeue('ajax');
});
我一直都在为'synchronus'ajax做这件事。