$(".room").each(function () {
i = i + 1;
alert(i);
roomid = $(this).attr("id");
alert(roomid);
$.get("QueryRoom.aspx?ID=" + roomid, function (data) {
$("#" + roomid).html(data);
});
});
});
似乎我的获取查询中间的宽限期不会更新并且停留在#22(最后一个房间ID)。 get请求执行正常,因为我可以看到div更改内容。
有人可以帮忙吗?
答案 0 :(得分:3)
您需要的是一个闭包,用于在异步调用完成之前保留roomid
的值。创建闭包的一种方法是使用立即函数,将roomid
的值作为参数传递给它。
有十亿篇文章详细解释了闭包,但简单地说:闭包是从外部作用域访问变量的任何函数。在这种情况下,会创建一个特殊对象调用闭包,以便保留内部函数中引用的所有对象/变量的内存位置,从而创建各种上下文。
在我的示例中,一旦进行了此闭包,您实际上将roomid
隐藏在外部作用域中,因为您具有一个具有完全相同名称的变量的立即函数。因此,您只能访问immediate函数中的值,并且在ajax调用完成时它将具有正确的id。
$(".room").each(function () {
i = i + 1;
alert(i);
roomid = $(this).attr("id");
alert(roomid);
(function(roomid) {
$.get("QueryRoom.aspx?ID=" + roomid, function (data) {
$("#" + roomid).html(data);
});
})(roomid);
});
});
答案 1 :(得分:1)
roomid
在$.get
的所有回调函数之间共享。循环执行得足够快,在任何回调完成之前完全递增,因此它们都获得最大值。您可以通过各种方式更正此问题,但最简单的方法是将roomid
的当前值传递给进行ajax调用的闭包:
(function (roomid) {
$.get("QueryRoom.aspx?ID=" + roomid, function (data) {
$("#" + roomid).html(data);
});
}(roomid))
事实上,由于您没有使用var
,roomid
是全球性的。这可能不受欢迎。相反,你应该这样做:
var roomid = $(this).attr("id");
这将为roomid
函数的每次迭代创建一个新的.each
,这将不会被共享 - 这使得闭包不必要。