代码非常复杂,所以我在下面进行了简化,以确认我遇到的行为是否正常或是否因为我在代码中犯了其他错误。
我有两个单独的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返回错误的数据,如果第一个请求花费的时间超过第二个。
答案 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调用。