1

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

我有两个单独的 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 会获取用于 request#2 的数据,反之亦然。

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

我需要将回调绑定到它的特定请求,以便无论他们完成每个请求的顺序如何,它都是正确的回调。

其他信息:我的支持是 django-tastypie,在这一点上,我认为 sweetpie 以某种方式弄乱了响应。这是唯一合乎逻辑的结论,因为 javascript 似乎是不可变的。

这实际发生的证据是,当我检查对请求#1 的响应时,数据对象显然是为请求#2 准备的......

结论:感谢您确认“每次调用 ajax() 函数都会创建它自己的闭包”。这就是我认为出了问题的地方。我在我的 API 中发现了问题。我正在做一些时髦的事情,看起来我有一个变量没有及时被丢弃,如果第一个请求比第二个请求花费的时间长,API 会返回错误的数据。

4

2 回答 2

1

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

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

于 2013-09-04T22:57:16.673 回答
0

您可能会使用 jsonp 并在 URL 中为 $.ajax 指定回调查询参数

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

有关更多详细信息,请参阅 jquery 文档:http ://api.jquery.com/jQuery.ajax/

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

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

于 2013-09-04T22:55:38.873 回答