$ .ajax()回调没有绑定到他们的特定请求?

时间:2013-09-04 22:45:32

标签: javascript jquery ajax tastypie

代码非常复杂,所以我在下面进行了简化,以确认我遇到的行为是否正常或是否因为我在代码中犯了其他错误。

我有两个单独的ajax请求,每个请求都有自己唯一的回调。我不关心哪一个首先完成,一个不依赖于另一个

function ajax(url, cbS){
    $.ajax({
        url: url,
        contentType: 'application/json',
        dataType: 'json', 
        success: function(data){
            cbS(data)
        },
    });
}

function callbackSuccess1(data){
    $('#div1').html(data)
}
function callbackSuccess2(data){
    $('#div2').html(data)
}

//request#1
ajax(myapiurl+'&peram1=100', callbackSuccess1);
//request#2
ajax(myapiurl+'&peram2=200', callbackSuccess2);

问题:有时callbackSuccess1获取用于请求#2的数据,反之亦然。

似乎哪个请求完成首先触发callbackSuccess1,第二个完成触发callbackSuccess2。

我需要将回调绑定到它的特定请求,这样无论它们完成每个请求的顺序如何,都会触发它正确的回调。

其他信息:我支持的是django-tastypie,此时我认为tastypie在某种程度上搞乱了反应。鉴于javascript似乎是不可变的,这是唯一合乎逻辑的结论。

实际发生这种情况的证据是,当我检查请求#1的响应时,数据对象明确用于请求#2 ...

结论: 感谢您确认'每次调用ajax()函数都会创建它自己的闭包'。这就是我认为出了问题。我在API中发现了这个问题。我正在做一些时髦的东西,看起来我有一个变量没有及时被破坏导致API返回错误的数据,如果第一个请求花费的时间超过第二个。

2 个答案:

答案 0 :(得分:1)

我看到你使用的代码唯一的问题是函数参数是cbS,但是你正在调用cbs(data) - 注意不同的大小写。

除此之外,每次调用ajax()函数都会创建它自己的闭包并拥有它自己的参数,这些参数将分别保留用于内部成功回调。这是javascript中的一项重要功能,它的工作原理。只要你没有使用在执行异步ajax调用期间可能发生变化的任何全局变量或状态,它就不会将一个调用的参数与另一个调用混淆。

答案 1 :(得分:0)

您可以使用jsonp并在URL中为$ .ajax

指定回调查询参数

回调将是javascript函数的名称,只要从服务器返回响应,就会调用它。

有关详细信息,请参阅jquery doc:http://api.jquery.com/jQuery.ajax/

理论上:http://en.wikipedia.org/wiki/JSONP

这主要用于跨站点ajax调用。