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 オブジェクトのスナップショットのように見えることです。これは、拡張による g() (および f()) への呼び出しによる摂動にもかかわらず、y.MyValue の状態が変化していないように見えるためです。 ) コールバック関数が実行される直前に発生した。

y の状態が適切に更新されるように、jQuery セレクターを更新する方法はあるのでしょうか。

編集:私の懸念を明確にするために、これはイベントキューの例です:

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 に答える