1

ajaxを使用してログイン関数を作成していますが、成功関数(SuccessLogin)がajax応答を取得する前に起動するという問題があります。EclipseからGoogleWebアプリとしてコードを実行していますが、Javaクラスファイルをデバッグすると、デバッガーがクラスファイルのブレークポイントをキャッチする前に、JavaScriptがクラスからの成功応答のアラートをスローしていることがわかります。私はここ数ヶ月しかコードを書いていませんので、私の側ではそれはばかげた小さなエラーだと確信しています。

$(document).ready(function() {

    sessionChecker()





    // sign in 
    $('#signInForm').click(function () {        
        $().button('loading') 
           var email = $('#user_username').val();   
           sessionStorage.email = $('#user_username').val();       
           var password= $('#user_password').val();

           var SignInRequest = {
                type: "UserLoginRequest",
                email: email,
                password: password
           }

           var data= JSON.stringify(SignInRequest);



           //disabled all the text fields
           $('.text').attr('disabled','true');

           //start the ajax
           $.ajax({

               url: "/resources/user/login", 

               type: "POST",

               data: data,     

               cache: false,

               success: successLogin(data)
           });       


       });






    //if submit button is clicked
   $('#Register').click(function () {        
        $().button('loading') 
        var email = $('#email').val();       

        if ($('#InputPassword').val()== $('#ConfirmPassword').val()) {
            var password= $('input[id=InputPassword]').val();
        } else {alert("Passwords do not match"); 
            return ;}
        var UserRegistrationRequest = {
                type: "UserRegistrationRequest",
                email: email,
                password: password
        }

        var data= JSON.stringify(UserRegistrationRequest);


        //disabled all the text fields
        $('.text').attr('disabled','true');

        //start the ajax
        $.ajax({

            url: "/resources/user/register", 

            type: "POST",

            data: data,     

            cache: false,

            success: function (data) {              

                if (data.success==true) {                  
                    //hide the form
                    $('form').fadeOut('slow');                 
                    //show the success message
                    $('.done').fadeIn('slow');
                } else alert('data.errorReason');               
            }       
        });

        return false;
    });
}); 

function successLogin (data){
       if (data.success) {                 
            sessionStorage.userID= data.userID
            var userID = data.userID
            sessionChecker(userID);
        } else alert(data.errorReason); 
       }

//session check
function sessionChecker(uid) {
    if (sessionStorage.userID!= null){
        var userID = sessionStorage.userID
    };

    if (userID != null){

        $('#user').append(userID)
        $('#fat-menu_1').fadeOut('slow')                
        $('#fat-menu_2').append(sessionStorage.email).fadeIn('slow') };
}
4

2 に答える 2

0

success: successLogin(data)

関数呼び出しと関数定義には違いがあります。

  • 関数定義はfunctionキーワードを使用し、関数本体を含みます{...}
  • 関数呼び出しは、関数名に括弧 (引数リスト) を追加し、実際に関数を呼び出して値を返します。

関数呼び出しをプロパティに割り当てると、値が返され、それが格納されます。これを回避するには、関数がパラメーターを取らない場合は関数名を使用するか、関数がパラメーターを取る場合は、関数呼び出しを別の関数の定義に埋め込みます。

  • パラメータなし:success: successLogin
  • パラメータがあります:success: function() { successLogin(data); }
于 2012-12-12T23:00:14.883 に答える
0

インラインで (すぐに) 実行されるのではなく、AJAX 呼び出しのスコープ内で実行されるようにするには、成功を匿名関数でラップする必要があります。

success: function() { successLogin(data) }
于 2012-12-12T22:44:44.390 に答える