2

電子メールを検証するために jquery 検証を使用しました。ただし、成功関数で値が変更された変数は、その外部からアクセスできません。これは async=false で実行できますが、それは Ajax の目的を破壊します。

以下はコードです:

$.validator.addMethod('verifyemail',function(value,element){        
    $.ajax({
        type: "POST",
        url : $.app.urls('base_url')+'account/check_email',
        data: {'email' : value},
        success: function(msg){
            //If email exists, set response to true
            if( msg.status == 'false' )
                respond = false;
            else
                respond = true;
        }
    })
    console.log(respond);
    return respond;
}, "Email is Already Taken");
4

4 に答える 4

4

そのような非同期関数で値を設定することはできません。これが機能する方法はrespond、値に設定されることです。次に、非同期 ajax 呼び出しが実行され、ajax 呼び出しの下の残りのコードが実行されるとすぐに実行されます。ajax 呼び出しが返されると、成功コールバックのコードが実行されます。ほとんどの場合、この時点までにバリデータ関数の実行は終了しています。

この ajax 呼び出しをバリデーターで使用しているため、検証は ajax 呼び出しの結果に依存するため、これを連続して実行する必要があります。を設定することでこれを実現できますasync: false

非同期コールバックとその仕組みに関する有用なリソースを次に示します。

http://blog.parse.com/2013/01/29/whats-so-great-about-javascript-promises/

そして、jQuery の AJAX 関数 async と sync をカバーする別の記事:

http://net.tutsplus.com/tutorials/javascript-ajax/event-based-programming-what-async-has-over-sync/

于 2013-07-17T05:15:43.027 に答える
1

Ajax 呼び出しは非同期です。つまり、console.log(respond); を呼び出したときです。変数 Respond はまだ使用できません。成功関数の外部でアクセスする必要がある場合は、カスタム イベントをトリガーし、イベント ハンドラーで応答を得ることができます。

そしてもちろん、応答を外側のスコープに配置する必要があります。

于 2013-07-17T05:19:33.587 に答える
-1

応答変数にアクセスするには、上位スコープで定義する必要があります

$.validator.addMethod('verifyemail',function(value,element){        
    var respond = true; // scope of variable to current function
    $.ajax({
        type: "POST",
        url : $.app.urls('base_url')+'account/check_email',
        async: false,  
        data: {'email' : value},
        success: function(msg){
            //If email exists, set response to true
            if( msg.status == 'false' )
                respond = false;
            else
                respond = true;
        }
    })
    console.log(respond);
    return respond;
}, "Email is Already Taken");
于 2013-07-17T05:10:05.037 に答える