【发布时间】:2013-09-06 22:59:44
【问题描述】:
我有一个从 jQuery 选择器派生的变量 y:
function g() {
jQuery('.MyProperty').each(function(){
var x = jQuery(this);
f(x);
});
}
function f(x) {
var y = x.siblings('SomeProperty').children('SomeClass');
var myValue = random();
y.MyValue = myValue;
jQuery.ajax(
/* ... */
success: function {
if (myValue != y.MyValue) {
/// Do something!
} else {
/// Do something else!
}
}
);
}
现在,让我们假设 g() 是一个事件处理程序,它在用户单击按钮时运行。这意味着它可以连续发射。由于 f() 触发异步 AJAX 调用,浏览器在成功之前不会阻塞,并且在所有 f() 调用完成后它们都可能以某种随机顺序到达(请记住,它们不会阻塞 AJAX 调用并且将刚刚完成),例如:
我面临的问题是,每个 AJAX 回调中的 y 似乎是实际 DOM 对象的快照,因为尽管对 g() 的调用(和 f( ) by extension) 发生在回调函数运行之前。
我想知道是否有任何方法可以刷新 jQuery 选择器,以便正确更新 y 的状态。
编辑:为了澄清我的担忧,这是一个示例事件队列:
g() /// Sets y.MyValue to 1.5555
g() /// Sets y.MyValue to 634.34
g() /// Sets y.MyValue to 555555
AJAX call back // Reads y.MyValue as 1.5555 when it should be 555555
AJAX call back // Reads y.MyValue as 555555 which is correct
g() /// Sets y.MyValue to 4232
AJAX call back // Reads y.MyValue as 4232 which is correct
AJAX call back // Reads y.MyValue as 634.34 when it should be 634.34
这可能会在服务器响应时间出现波动时发生。
【问题讨论】:
-
正如 Pointy 所说,它们是快照。但是您问题中的代码似乎与此无关。
-
y是一个局部变量,包含您在同一范围内创建的对象。它不是对 DOM 的引用,尽管它在内部包含对 DOM 的引用。所以/// Do something!永远不会执行也就不足为奇了。了解您试图实现的实际最终目标是什么会很有用。您只是想限制 AJAX 请求吗? -
基本上,我想与适当的 DOM 对象重新同步。我见过 threads 谈论刷新 jQuery 选择器,但这仅适用于非常简单的选择器,而不适用于在这个特定示例中像 y 这样的多层深的选择器。
-
这可能会帮助您理解一点:jsfiddle.net/x8VFM/1。您会注意到变量 y 始终是当前值。您可能还有其他问题。
标签: javascript jquery ajax