在開發手機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