我正在用PHP开发一个应用程序,在某些时候,应用程序必须进行多个AJAX POST(每个都返回少量的HTML)。每个POST都必须在div中插入返回的HTML。我没有遇到这个问题,但是当我立刻启动所有AJAX POST时(问我说我开始10),问题出现了,我为每个POST指定了一个单独的div。因为它们都是异步的并且它们都在几乎相同的时间返回所有HTML最终都在一个div中,而不是每个单独的div。我会发布一些代码来澄清。这是我的'apiCall'功能的精简版:
xhr = $.ajax({
type: "POST",
url: "../api.php",
dataType: "json",
data: data,
success: function(data) {
obj.html(data.D['html']);
}
});
这是问题发生的成功函数。 data.D ['html']包含来自POST的HTML,但我认为它会被下一个AJAX POST覆盖,这就是为什么我所看到的是最后返回的AJAX POST被放入div中(这是jQuery的一部分)我写的插件,obj是传入的div)我称之为:
$("#container).apiCall({options...});
任何人都可以提供一个解决方案,以便当这些AJAX POST返回时,我可以将来自该特定POST的返回数据放入正确的div中吗?
答案 0 :(得分:3)
你这样做了几次,你总是指的是同一个obj。 在此期间,你正在覆盖你的obj。
当设置所有ajax函数并且响应开始到达(并且回调开始运行)时,所有obj引用都指向obj的最后一个值。
使用闭包将其保存在另一个变量中(在本例中为myObj):
xhr = (function(){
var myObj = obj;
return $.ajax({
type: "POST",
url: "../api.php",
dataType: "json",
data: data,
success: function(data) {
myObj.html(data.D['html']);
}
});
})();
不是将$ .ajax()直接返回到xhr,而是创建一个匿名函数并立即调用它:( function(){ /* code */ } )()
该函数将“备份”obj转换为myObj(匿名函数的本地变量),然后简单地返回$ .ajax()返回的内容。
我没有测试这段代码。告诉我是否有任何错误。