来自javascript的同步Json调用

Tro*_*roy 2 javascript jquery json jsonp

我正在开发一个项目,在这个项目中我需要进行多个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!");
    }
Run Code Online (Sandbox Code Playgroud)

Roc*_*mat 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!");
});
Run Code Online (Sandbox Code Playgroud)

注意:由于这是异步的,destinationData因此在触发回调之前将无法使用.将使用任何代码.done()回调.

  • @ Pow-Ian:这可能有点令人困惑.jQuery中的所有AJAX方法现在都返回"promise"对象.这些promise有一个`.done()`方法,当它完成时调用.Promise可以与`$ .when()`组合,后者本身返回promise(它有一个`.done()`方法).您还可以使用`var d = new $ .Deferred`创建自己的promise对象,并在完成后对该新延迟调用`d.resolveWith()`方法. (2认同)