0

jQuery/JavaSCript 関数があります。

function CheckPostcode() {
    // if checkbox is checked then hide and return true
    // if checkbox is not checked (visible or not) then check postcode is known via Ajax call
    // if not known then display the checkbox and return false
    //
    if ($('#perinatalWomanView_AcceptUnknownPostcode').is(':checked')) {
        $("#AcceptUnknownPostcode").hide();
        return true;
    }
    $.getJSON('@Url.Action("PostcodeCheck", "AjaxValidation", new { area = "" })', { postcode: $('#perinatalWomanView_Postcode').val() }, function (result) {
        if (result.postcodeFound == true) {    // executes SECOND
            $("#AcceptUnknownPostcode").hide();
            return true;
        }
        $("#AcceptUnknownPostcode").show();
        return false;
    });
    return false;    // executes FIRST
} //CheckPostcode

それは正しいようですが、AJAX getJSON 応答は順不同で動作しています (これを確認するために Firebug とアラートを別々に使用しました)。実行順序を示すためにコードに注釈を付けました。Ajax 呼び出しは正しく実行されます。

何が欠けていますか - ありがとう。

4

4 に答える 4

4

それが正常な動作です

AJAX は本質的に非同期であるため、これは正常な動作です。これは、AJAX のAが表すものです。

これは、外部リソース (サーバー) からのリクエストが並行して処理され、結果が受信されたときにそれらを処理することはできますが、それらが順番に処理されるとは期待できないことを意味します。

悪い修正

シーケンシャル志向の人向けの簡単な (そして悪い) 修正方法があります。AJAX 呼び出しを同期化します。$.getJSON定義済みのパラメーターが$.ajaxいくつかあるだけです。$.ajax受け入れるパラメーターの 1 つは、asyncデフォルトで true です。$.getJSON呼び出しを同等の$.ajax呼び出しに置き換えて、パラメーターを追加するだけasync: falseです。

ところで: jQuery はこのパラメーターを非推奨にしました。私は現在の jQuery リリースに最新の情報を持っているわけではありませんが、API から既に削除されている可能性があります。

良い簡単な修正

それ以外の場合 (推奨)、イベント ドリブン環境について学習します。それらはシーケンシャルであることには依存しませんがcallback、イベントがトリガーされた瞬間に実行される機能を提供します。これは、処理する必要があるデータが宣言の時点ではなく、後で利用できることを意味します。

//イベントを宣言するcallbackと、jQueryはどこかに格納されたものを保持し、イベントがトリガーされたとき (および場合) にのみ実行します。すぐには実行されません。 //何もしないと、まったく実行されません。clickhoverfocuscallbackclickhoverfocus

AJAX の場合も同じです。jQuery に、サーバーが応答の転送を完了した直後に実行されるコールバック関数を指定します。

ところで、この修正は構造的にどこでも簡単に使用できるわけではありません。そのデータを処理するレイヤーが 1 つしかない場合は機能しますが、それ以上のロジックが含まれている場合は面倒になります。

より複雑な修正

これにより、あなたはまっすぐで狭い道を歩み、二度と迷うことはありません.

好きな名前で独自のイベントを作成できます。そのイベントがトリガーされたときに実行されるイベント ハンドラーをアタッチします。

そのイベントをトリガーし、イベント変数を渡すように AJAX 要求に指示するだけです。すでにセットアップしたイベント ハンドラーが呼び出され、残りは詩です。

$('body').bind('my_event', function(event) {
    results_from_ajax = event.data;
});

$.getJSON(function(server_results) {
    $('body').trigger('my_event', server_results);
});

トリガー関数を見ると、イベント ハンドラーに送信されるいくつかの追加パラメーターを定義できることがわかります。

イベント オブジェクトの構造を見ると、event.type - イベントの名前、event.target - それをトリガーしたオブジェクト、event.data - トリガーが渡したデータ、および他の多くの有用な (またはそうでない) 情報が含まれています。 .

おそらく最善の修正

まだ読んでいない(詳細ではない)新しい機能がいくつかありますが、それらを理解している限り、それらはまだ利用できない情報に操作を適用するためのインフラストラクチャを提供します。データが利用可能になります。

http://api.jquery.com/category/deferred-object/

私はそれを使用したことがなく、上記のおそらく間違った説明以外は理解していないので、これを説明することはできません. 誰かがこれの要点を持っている場合は、私たち全員を啓発してください.

于 2012-10-05T09:03:52.283 に答える
0

最後return false;はコールバック関数の外にあります。そのため、最初に実行されます。この関数から true または false を返す必要はまったくないと思いますが、結果を受け取ったときに DOM で何かを行うこともできます。

于 2012-10-05T09:06:26.010 に答える
0

$.ajax は非同期呼び出しです。したがって、次のコードの実行はブロックされません。そのため、return false$.ajax が完了するずっと前に実行されます。

于 2012-10-05T09:03:55.920 に答える
0

AJAX 呼び出しは非同期で実行されます。つまり、getJSON 関数はすぐに戻り、次のコード行に移動します。AJAX が完了する前に外部関数が返されるため、ロジックを少し再考する必要があります。

より良いアイデアは、完了ハンドラー内から呼び出される完了関数を持つことです。

于 2012-10-05T09:04:18.660 に答える