关于javascript异步编程的理解

  在开发手机app的时候,要使用ajax想向后台发送数据。然后遇到了一个bug,通过这个bug,理解了ajax异步请求的工作原理。下面是登录页面的源代码。

<!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是异步的请求,

  

 

  

  这就是为什么会出现先弹出2,后弹出1,最后弹出3。

 

转载于:https://www.cnblogs.com/1102whw/p/7985540.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值