0

私はjQueryでこの関数を書きました:

function checkAvailability(value) {
    var result = true;
    $.getJSON("registration/availability", { username: value }, function(availability) {            
        if (!availability)
            result = false; 
            alert("in getJSON: " + result);
    });
    alert(result);
    return result;
}

この秒後に「getJSON」からアラートを受け取りました。なぜこのようになったのでしょうか。

ユーザー名の可用性をチェックするSpring MVCプロジェクトとコントローラーメソッドがあります。コントローラ メソッドは正常に動作します。しかし、最終結果を受け取るのが遅すぎます。関数で適切に値を返すように同期するにはどうすればよいですか?

編集

jQueryの検証でこの関数を使用しています。checkAvailability()テスト中に関数を抽出しました。

$.validator.addMethod("checkAvailability", function(value, element, param) {    
    var das = checkAvailability(value);
    return das;
}, jQuery.format("Someone already has that username. Please try another one."));

そして、これは私のフォーム検証です:

$(".form").validate({
    rules: {
        username: {
            checkAvailability: true
        },
        ....
    },
    messages: {
    }
});

編集2

これは私のコントローラーメソッドです。ブール値を返します。ユーザー名が取得された場合、false 値が返されます。

@RequestMapping(value="/registration/availability", method = RequestMethod.POST)
public @ResponseBody boolean getAvailability(@RequestParam String username) {       
    List<User> users = getAllUsers();           

    for (User user : users) {
        if (user.getUsername().equals(username)) {
            return false;
        }
    }

    return true;
}
4

2 に答える 2

1

なぜこれがこのように振る舞うのですか?

$.getJSONは、AJAX リクエストを作成するための省略形です。ajax の「A」は非同期を表します。つまり、JavaScript エンジンは getJSON 呼び出しを開始し、すぐに次の行を実行します。alert(result); return result;

Web サービスによって返される実際の値は、後でコードによって受信されます。successgetJSON に渡した関数は、js エンジンがサーバーからの応答を受け取ると呼び出されます。ご覧のとおり、その時点では手遅れです。

さらに読む: https://developer.mozilla.org/en/AJAX

これを機能させるにはどうすればよいですか?

それはあなたの状況によって異なります。誰が呼んでいcheckAvailabiltyますか?この関数がどのように使用されているかについていくつかのコードを投稿すると、私の提案で例を示すことができます。

私の頭の上から離れて、あなたはjquery deferredsを利用することができます.同じ. または、成功関数内から実行されるコールバック関数を渡すこともできます。

編集:

http://docs.jquery.com/Plugins/Validation/Methods/remote#options

サーバー側のリソースは $.ajax (XMLHttpRequest) 経由で呼び出され、検証された要素の名前とその値に対応するキーと値のペアを GET パラメーターとして取得します。応答は JSON として評価され、有効な要素の場合は true である必要があり、無効な要素の場合は false、未定義、または null のいずれかになります。

実際のアイデアを得るには、デモhttp://jquery.bassistance.de/validate/demo/captcha/を確認してください。

Firebug または選択した開発者ツールを開きます。AJAX リクエストを表示できるタブに移動します。キャプチャを入力して送信します。開発者ツールにリストされている ajax リクエストを確認します。クエリ文字列パラメーターに注意してください。応答に注意してください。単純な「真」または「偽」です。

于 2012-07-13T10:56:26.777 に答える
0

これが役立つかどうかはわかりませんが、使用できます

var result;
$.ajax( {
        url : "registration/availability",
        data : data,
        async : false  //syhcrononous ajax request ;)
}).done(function(data) {
    result = data;
});

詳細については、JQuery AJAX docを参照してください。

于 2012-07-13T15:02:52.823 に答える