0

次のコードがあります。

var bduplicate;
bduplicate = false;
bduplicate = check_for_duplicate_rule().done(function (result) {
    console.log("result from check for duplicate" + result);
    if(result == 'true') {
        $('#validation_error').html("A similar rule already exists");
        return result;
    }
});

console.log(bduplicate);

if(bduplicate.success == 'true') {
    console.log('im exiting');
    return false; //exit this function
}

async メソッド自体の定義は次のとおりです。

function check_for_duplicate_rule() {
    var parameters = {
        num: $('#num').val(),
        condition: $('#condition').val(),
        cdidnumber: $('#cdidnumber').val()
    }

    return $.getJSON(
        url = aURLdefinedsomewhere,
        parameters,
        function (data) {
            //if (data=='true') {                               
            //$('#validation_error').html("A similar rule already exists");     
            //}
        } //end data
    ); //end getJSON        
}

問題:

システムは、コンソールに「im enter」と表示される IF ステートメントに入りません。ただし、validation_error 要素のテキストは正しく変更されます。そして、コンソールに次のように表示されます: result from check for duplicate:true ".

私がこれまでに試したこと:

コードに次の行を含めました。

console.log(bduplicate);

私が何を取り戻しているかを見るために。コンソールには、オブジェクトの内容が出力され、さまざまなプロパティが含まれています。「responseText」プロパティと呼ばれるものがあり、responseText: ""true"↵" と表示されます。これが問題でしょうか? ただし、そうである場合、検証エラー要素を設定するテストが合格する理由は説明されていません。

それが役立つ場合、サーバーは次のような ajax 呼び出しのデータです。

 return json.encode(true)

質問:

  1. 「console.log('im exiting')」コマンドの結果を表示するコードを取得できない理由を理解しようとすることに加えて、json データを返す方法が正しい?
    技術的には、次のようになるはずだとどこかで読みました。

    return json.encode('success: true') これが正しければ、フロントエンドで true をテストするにはどうすればよいですか?

  2. .done() メソッドによって返されるオブジェクトに関するドキュメントを教えてもらえますか? jquery API を検索していますが、まだ何も見つかりません。私はおそらく正しいキーワードで検索していません。

ありがとう。

4

3 に答える 3

1

のような jQuery AJAX メソッドは$.getJSON、遅延オブジェクトを返します。これらにより、AJAX 呼び出しが完了したときにトリガーされるコールバックをアタッチできます。

.done()コールバックをアタッチしています。AJAX では非同期です。つまり、バックグラウンドで実行されます。非同期メソッドから戻ることはできません。あなたreturn result;は絶対に何もしません。

コールバック内で返されたデータに関連するすべてのアクションを実行する必要があります。

jQuery の遅延オブジェクトのドキュメントは次のとおりです: http://api.jquery.com/category/deferred-object/

于 2013-07-29T18:02:27.600 に答える
1

質問 1 への回答: 呼び出しは非同期です。つまり、要求が完了する前に追加のプロセスを実行できます。console.log(bduplicate);Chrome では更新されたオブジェクトが表示されるため、少し誤解を招く可能性がありますが、実際には呼び出しが終了するまで更新されません。コールバック外のコードは、呼び出しが完了する前に実行さます。コールバック ハンドラ内でデータを適切に渡す方法を理解する必要があります。

質問 2 への回答: promises/deferredパラダイム ( http://api.jquery.com/deferred.done/jQuery.ajax > jqXHR.done )の一部です。オブジェクトは jqXHR http://api.jquery.com/jQuery.ajax/#jqXHRのプライベート インスタンスから取得されます。

于 2013-07-29T18:01:30.563 に答える