2

我正在做一个项目,我需要在一个循环中进行多个 JSON 调用。一旦我退出该循环,我就需要处理我所做的所有调用的结果。我很难理解如何以我的操作顺序有效的方式进行这些调用。我处理结果的代码总是在对服务的调用完成之前执行。我创建了一个 jsfiddle 来演示并在此处包含代码。

http://jsfiddle.net/VEkrf/3/

    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!");
    }
4

2 回答 2

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()回调中。

于 2013-02-06T21:04:44.147 回答
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');
});

我一直在为“同步”ajax 做这件事。

这是我正在谈论的一个例子

于 2013-02-06T20:55:17.393 回答