3

我有一个从 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 对象的快照,因为 y.MyValue 的状态似乎没有改变,尽管对 g() (和 f() 的调用产生了扰动) ) 发生在回调函数运行之前。

我想知道是否有任何方法可以刷新 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

当服务器的响应时间出现波动时,这可能会发生。

4

2 回答 2

1

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

于 2013-09-03T16:57:09.483 回答
0

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

于 2013-09-03T16:35:10.030 回答