是jQuery选择器快照还是实时更新

时间:2013-09-03 16:09:34

标签: javascript jquery ajax

我有一个派生自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

当服务器中的响应时间出现波动时,可以假设发生这种情况。

2 个答案:

答案 0 :(得分:1)

jQuery对象不是DOM的快照。 它们只是包装器,它们是包含DOM元素引用的对象(与您的选择器匹配)。 事实上,每次使用jQuery函数时,都会创建一个jQuery对象的新实例。所以你的g()函数每次都会将一个新实例传递给f()。然后f在这个新创建的jQuery对象实例上创建一个MyValue属性。然后为每个ajax调用创建一个New success处理程序。 y.MyValue和myValue将始终相等,因为您每次都创建所有内容的新实例,并告诉这些值是相等的。

答案 1 :(得分:0)

如评论中所述,它们是特定时间点的快照。除非我遗漏了什么,为什么不在成功回调中更新y(使用你需要的任何选择器)?