来自javascript的同步Json调用

来自javascript的同步Json调用,javascript,json,jquery,jsonp,Javascript,Json,Jquery,Jsonp,我正在做一个项目,在这个项目中,在一个循环中,我需要进行多个JSON调用。一旦我退出这个循环,我就需要处理所有调用的结果。我很难理解如何以这样的方式拨打这些电话,以确保我的操作顺序正常。我处理结果的代码总是在服务调用完成之前执行。我创建了一个JSFIDLE来演示,并在这里包含了代码 既然您已经在使用jQuery,我建议您研究一下队列函数。您可以对ajax调用进行排队,然后在成功处理程序中调用de queue或next函数。这样他们一个接一个地走。添加到队列的最后一项是处理返回数据的函数 var

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


既然您已经在使用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做这件事

这看起来像是我和我的伙伴的工作

将所有
$.getJSON
调用传递到
$。当
调用完成后,我将调用一个包含所有结果的函数

看看这个:

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!");
});
var sourceData={
“fooIndex”:“foo”,
“barIndex”:“bar”
};
var destinationData={};
//AJAX调用数组
var AJAX=[];
for(sourceData中的var sourceIndex){
AJAX.push($.getJSON('http://echo.jsontest.com/“+sourceIndex+”/“+sourceData[sourceIndex]+”?回调=?”);
}
//需要Apply将每个元素作为参数传递
$.when.apply($,AJAX).done(函数(){
//完成所有AJAX调用后,将调用此函数
//functin的参数是每个请求的响应
for(var i=0,len=AJAX.length;i

注意:由于这是异步的,
destinationData
在触发回调之前不可用。将任何使用该方法的代码放入
.done()
回调中。

不要使用同步AJAX。它的速度非常慢,特别是当你做了几个的时候。相反,计算完成的请求数,并对最后一个请求执行一些操作。在我的情况下,我使用的服务一次只能处理10条记录。我将收集100多条记录,然后将它们重新组合成10组,并发送请求。当我得到响应时,我需要知道是第一个、第二个还是第三个请求,这样我才能将结果与源数据进行匹配。该服务无法发送密钥,因此我可以将结果与原始记录进行匹配。我想不出比同步更好的方法了。我读过很多关于Different的文章,但是我从来没有成功地实现过它。这是一个很好的例子。@Pow Ian:当我第一次看到它的时候,我也在与它斗争。一旦你了解了就不算太糟了。我一直想再看一眼。我意识到它确实比排队等这样的事情更有实际意义。@Pow Ian:它可能有点让人困惑。jQuery中的所有AJAX方法现在都返回“promise”对象。这些承诺有一个
.done()
方法,在完成时调用该方法。承诺可以与
$.when()
组合,后者本身返回承诺(具有
.done()
方法)。您还可以使用
var d=new$.Deferred
创建自己的promise对象,并在完成后对新的Deferred对象调用
d.resolveWith()
方法。@特洛伊:是的,它将::-)
done()
方法中的参数的顺序与传递给
$的顺序相同。当
时(意味着
参数[1]
将是第二个AJAX请求)。下面是一个示例,请注意与
sourceData
的顺序相比,
alert
的顺序:在我学会如何使用jQuery Deferred之前,我会使用这种方法。:-)我通常会做同样的事情,直到我花时间学习延迟(感觉就像在节点中使用);当你有一个要发送的东西的静态“队列”时。对于调用的动态“队列”,我通常会使用
$()。队列仍然是
。但是如果成功和错误处理程序不是静态的呢?你会怎么做?您是否能够分配多个已完成处理程序,还是必须将成功函数传递给延迟处理程序?jQuery是否一次执行所有过程,并且在它们全部完成时仅触发“完成”?在这种情况下,当传递给DEFERED的第二个函数需要只有在第一个函数完成后才可用的信息时,会发生什么情况?@Pow-Ian:非常确定DEFERED同时运行所有函数,然后在所有函数完成后调用
.done
。如果您需要从另一个函数中的一个函数获取信息,那么队列可能就是您的方法。根据讨论,我不确定哪一个是“更好”的解决方案。你的也用小提琴演奏,但我最终使用了危险品。非常感谢你的帮助。
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!");
});