我有一个派生自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)的调用的扰动,y.MyValue的状态似乎没有改变。 ()扩展)在回调函数运行之前发生的。
我想知道是否有任何方法可以刷新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
当服务器中的响应时间出现波动时,可以假设发生这种情况。
答案 0 :(得分:1)
jQuery对象不是DOM的快照。 它们只是包装器,它们是包含DOM元素引用的对象(与您的选择器匹配)。 事实上,每次使用jQuery函数时,都会创建一个jQuery对象的新实例。所以你的g()函数每次都会将一个新实例传递给f()。然后f在这个新创建的jQuery对象实例上创建一个MyValue属性。然后为每个ajax调用创建一个New success处理程序。 y.MyValue和myValue将始终相等,因为您每次都创建所有内容的新实例,并告诉这些值是相等的。
答案 1 :(得分:0)
如评论中所述,它们是特定时间点的快照。除非我遗漏了什么,为什么不在成功回调中更新y
(使用你需要的任何选择器)?