Javascript $.ajax()回调是否未绑定到其特定请求?

Javascript $.ajax()回调是否未绑定到其特定请求?,javascript,jquery,ajax,tastypie,Javascript,Jquery,Ajax,Tastypie,代码非常复杂,因此我在下面对其进行了简化,以确认我所经历的行为是否正常,或者是由于我在代码中犯了一些其他错误 我有两个单独的ajax请求,每个请求都有自己独特的回调。我不在乎哪一个先完成,一个不依赖另一个 function ajax(url, cbS){ $.ajax({ url: url, contentType: 'application/json', dataType: 'json', success: functi

代码非常复杂,因此我在下面对其进行了简化,以确认我所经历的行为是否正常,或者是由于我在代码中犯了一些其他错误

我有两个单独的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似乎是不可变的

证明这一点的证据是,当我检查请求响应时,数据对象显然是用于请求的

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

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

回调将是javascript函数的名称,每当从服务器返回响应时都将调用该函数

有关更多详细信息,请参阅jquery文档:

理论上:


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

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

回调将是javascript函数的名称,每当从服务器返回响应时都将调用该函数

有关更多详细信息,请参阅jquery文档:

理论上:


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

我看到的关于您包含的代码的唯一问题是函数参数是
cbS
,但是您正在调用
cbS(数据)
——请注意大小写不同


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

我看到的关于您包含的代码的唯一问题是,函数参数是
cbS
,但您正在调用
cbS(数据)
-注意不同的大写字母


除此之外,每次调用
ajax()
函数将创建自己的闭包,并有自己的参数,这些参数将被单独保留用于内部成功回调。这是javascript中的一个重要功能,它可以工作。只要不使用任何全局变量,它不会将一个调用的参数与另一个调用的回调混淆或者在异步ajax调用的执行过程中可能更改的状态。

您看到的错误甚至不可能出现。每个ajax函数调用各自的回调函数,h3ll中没有办法交换它们,除非您以某种方式交换它们。为了同意adeneo的观点,下面是一个使用示例代码的小把戏(调整为使用JSFiddle的/echo/html/route),您可以看到,无论运行多少次,第一个div总是得到“0”,第二个div总是得到“1”你能给我们看一个发生这种情况的工作页面吗?这表明你正在使用的浏览器中有一个主要的错误,所以大多数人对你的帖子的反应都是假设用户有错误,除非你有证据。浏览器信息也会很有用。我同意你所有的说法,我可能在某个地方弄错了什么。我只是想跟踪这件事向下..然而,我严重怀疑我是否“切换了它们”。因此我想我只是想寻找一些线索,了解这是如何发生的。不幸的是,这里的代码太多了。您看到的错误甚至不可能发生。每个ajax函数都调用它各自的回调函数,h3ll中没有任何方法可以避免它们除非您以某种方式交换了它们,否则它们将被交换吗?为了同意adeneo的观点,这里有一个使用示例代码的fiddle(调整为使用JSFIDLE的/echo/html/route),您可以看到,无论您运行它多少次,第一个div总是得到“0”,第二个div总是得到“1”你能给我们看一个发生这种情况的工作页面吗?这表明你正在使用的浏览器中有一个主要的错误,所以大多数人对你的帖子的反应都是假设用户有错误,除非你有证据。浏览器信息也会很有用。我同意你所有的说法,我可能在某个地方弄错了什么。我只是想跟踪这件事向下..然而,我严重怀疑我是否“切换了它们”。因此我想我只是在寻找一些关于如何发生这种情况的线索。不幸的是,这里放的代码太多了。很好,但上面的示例实际上只是伪代码。而不是实际代码。@arctelix-伪代码y没有明显的错误你已经共享了,所以你没有共享的部分一定有问题。你报告的问题在javascript中不是问题。每个函数都有自己的闭包和save的参数。你可能需要显示更多的真实代码,才能获得关于问题原因的帮助。而不是