3

私のJavaScriptコード -

function updateWhatIfPrivacyLevelRemove(recordId, correspondingDetailIDs) {
    var ajaxCall = $.ajax({ data: { Svc: cntnrRoot,
        Cmd: 'updateWhatIfPrivacyLevel',
        updatePrivacyAction: 'Remove',
        recordID: recordID
        },
        dataType: "text",
        context: this,
        cache: false
    });

    $.when(ajaxCall).then(updateWhatIfPrivacyLevelRemoveSuccess(recordID, correspondingResidentDetailIDs));
}

function updateWhatIfPrivacyLevelRemoveSuccess(recordID, correspondingResidentDetailIDs) {
    //several other lines of non-related code
            $.ajax({ data: { Svc: cntnrRoot,
                Cmd: 'handleResidentRow',
                recordID: 1,
                active: 0
            },
                dataType: "text",
                context: this,
                cache: false
            });
}

C# コード内で、'updateWhatIfPrivacyLevel' と 'handleResidentRow' のコールバックを処理します。updateWhatIfPrivacyLevel の前に、handleResidnetRow への AJAX コールバックが呼び出されていることがわかります。

なんで?

4

1 に答える 1

2

コールバックを設定しようとしているときは、実際には関数を呼び出しています。つまり、「updateWhatIf...」関数をコールバックとして渡すのではなく、その戻り値を渡します (これは常に のように見えますundefined)。

代わりにこれを試してください:

$.when(ajaxCall).then(function() {
  updateWhatIfPrivacyLevelRemoveSuccess(recordID, correspondingResidentDetailIDs);
});

関数名への参照は、オブジェクトとしての関数への参照であり、関数をコールバックとして渡すために使用できます。ただし、関数への参照の後に続くの( )は、関数の呼び出しであり、周囲の式のコンテキストで戻り値を使用できるように評価されます。したがって、コードでは、undefined(関数呼び出しの結果) を.then()メソッドに渡しますが、もちろん、これは希望どおりにはなりません。

jQuery は単なる JavaScript であり、特に JavaScript 関数ライブラリであることに注意してください。これは言語構造のように見えますが、そうではありませ.then()ん— JavaScript インタープリターはそれを特別に扱うわけではありません。

私の提案のように匿名関数を使用する代わりに.bind()、新しいブラウザーで Function プロトタイプのメソッドを使用することです。これは基本的に同じことを行いますが、スタイル的には従来の関数型プログラミングに似ています。

于 2012-07-29T16:41:41.940 に答える