關於javascript異步編程的理解

  在開發手機app的時候,要使用ajax想向後臺發送數據。而後遇到了一個bug,經過這個bug,理解了ajax異步請求的工做原理。下面是登陸頁面的源代碼。javascript

<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
        <title></title>
        <script src="js/mui.min.js"></script>
        <script type="text/javascript" src="js/whw.js"></script>
        <script src="js/jquery.min.js"></script>
        <script src="js/jquery.md5.js"></script>
        <link href="css/mui.min.css" rel="stylesheet" />
        <link rel="stylesheet" type="text/css" href="css/base.css" />
    </head>
    <body>
        <header class="mui-bar mui-bar-nav" id="header">
            <a class="mui-action-back mui-icon mui-icon mui-icon-arrowthinleft mui-pull-left"></a>
            <h1 style="width:86%" class="mui-title text-left"><span>|</span>登陸<b>忘記密碼</b></h1>
        </header>
        <div class="mui-content login" id="login">
            <div>
                <img src="img/default.png" />
            </div>
            <h3 class="h3">美團帳戶登陸</h3>
            <ul class="mui-table-view">
                <li class="mui-table-view-cell">
                    <label for="">手機號碼</label>
                    <input type="text" id="tbPhone" />
                </li>
                <li class="mui-table-view-cell">
                    <label for="">密碼</label>
                    <input type="password" id="tbPwd" />
                </li>
            </ul>
            <button class="button" id="btnLogin">登陸</button>
            <div class="register">
                <a href="javscript:;">當即註冊</a>
                <a class="phone_login" href="javscript:;">手機號碼快捷登陸></a>
            </div>
        </div>
    </body>
    <script type="text/javascript">
        mui.init();
        mui.plusReady(function() {
            document.getElementById("btnLogin").addEventListener('tap', function() {
                var phone = document.getElementById("tbPhone").value.trim();
                var pwd = document.getElementById("tbPwd").value.trim();
                var loginFlag = loginCheck(phone.pwd);
                if(loginFlag)
                {
                    alert('3      登錄成功');
                    localStorage.setItem('phone', phone);
                    plus.webview.currentWebview().close();
                    var homeWebview = plus.webview.getWebviewById('home.html');
                    homeWebview.evalJS('showUserInfo();');
                    mui.openWindow('home.html', 'home.html', { top: '0px', bottom: '51px' }, {}, false, {});
                }else {
                    alert('尬,輸入有誤!登陸失敗。。。');
                }
            });    
        });
        
        function loginCheck(phone,pwd)
        {
            var loginFlag = false;
            $.ajax({    
                url:globalUrl+'UserServlet',// 跳轉到 action    
                data:
                {
                    'action': 'loginHandin',
                    'id': phone,
                    'pwd': pwd
                },    
                type:'post',    
                cache:false,    
                dataType:'json',    
                success:function(data) 
                {
                    alert('1       ' + data.success);
                    loginFlag = data.success;
                },    
                 error : function() 
                 {
                      // view("異常!");    
                      alert("本機網絡異常!");    
                 }    
            }); 
            alert('2          ' + loginFlag);
        }
    </script>
</html>

    一開始,個人理解是這樣的。 我認爲是點擊登陸按鈕的時候,調用loginCheck方法,而後ajax向後臺發送數據,數據接收成功後,執行success方法,彈出1,而後,程序順序執行,彈出2,而後回到調用函數,再彈出3.我以爲順序是123,可是實際測試結果顯示的確是213,爲何?由於我是按照同步的思路去理解ajax的,事實上,這是錯誤的。ajax是異步的請求,css

  

 

  

  這就是爲何會出現先彈出2,後彈出1,最後彈出3。html

相關文章
相關標籤/搜索