在开发手机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。

关于javascript异步编程的理解的更多相关文章

  1. JavaScript异步编程的主要解决方案—对不起,我和你不在同一个频率上

    众所周知(这也忒夸张了吧?),Javascript通过事件驱动机制,在单线程模型下,以异步的形式来实现非阻塞的IO操作.这种模式使得JavaScript在处理事务时非常高效,但这带来了很多问题,比如异 ...

  2. JavaScript异步编程原理

    众所周知,JavaScript 的执行环境是单线程的,所谓的单线程就是一次只能完成一个任务,其任务的调度方式就是排队,这就和火车站洗手间门口的等待一样,前面的那个人没有搞定,你就只能站在后面排队等着. ...

  3. javascript异步编程的前世今生,从onclick到await/async

    javascript与异步编程 为了避免资源管理等复杂性的问题, javascript被设计为单线程的语言,即使有了html5 worker,也不能直接访问dom. javascript 设计之初是为 ...

  4. JavaScript异步编程(2)- 先驱者:jsDeferred

    JavaScript当前有众多实现异步编程的方式,最为耀眼的就是ECMAScript 6规范中的Promise对象,它来自于CommonJS小组的努力:Promise/A+规范. 研究javascri ...

  5. Promises与Javascript异步编程

    Promises与Javascript异步编程 转载:http://www.zawaliang.com/2013/08/399.html 在如今都追求用户体验的时代,Ajax应用真的是无所不在.加上这 ...

  6. 5分种让你了解javascript异步编程的前世今生,从onclick到await/async

      javascript与异步编程 为了避免资源管理等复杂性的问题,javascript被设计为单线程的语言,即使有了html5 worker,也不能直接访问dom. javascript 设计之初是 ...

  7. 转: Promises与Javascript异步编程

    在如今都追求用户体验的时代,Ajax应用真的是无所不在.加上这些年浏览器技术.HTML5以及CSS3等的发展,越来越多的富Web应用出现:在给与我们良好体验的同时,Web开发人员在背后需要处理越来越多 ...

  8. JavaScript异步编程

    前言 如果你有志于成为一个优秀的前端工程师,或是想要深入学习JavaScript,异步编程是必不可少的一个知识点,这也是区分初级,中级或高级前端的依据之一.如果你对异步编程没有太清晰的概念,那么我建议 ...

  9. 深入解析Javascript异步编程

    这里深入探讨下Javascript的异步编程技术.(P.S. 本文较长,请准备好瓜子可乐 :D) 一. Javascript异步编程简介 至少在语言级别上,Javascript是单线程的,因此异步编程 ...

随机推荐

  1. CentOS6安装各种大数据软件 第四章:Hadoop分布式集群配置

    相关文章链接 CentOS6安装各种大数据软件 第一章:各个软件版本介绍 CentOS6安装各种大数据软件 第二章:Linux各个软件启动命令 CentOS6安装各种大数据软件 第三章:Linux基础 ...

  2. 对sql作业的总结(PostgreSQL的递归查询)

    已知条件如下: CREATE TABLE appointment ( emp_id integer NOT NULL, jobtitle ) NOT NULL, salary ,) NOT NULL, ...

  3. zlib库的编译及使用

    * 打开网址http://zlib.net/ 下载zlib源码, * 解压压缩包,进入目录:C:\Users\Administrator\Desktop\zlib-1.2.11\zlib-1.2.11 ...

  4. 【转】netty源码分析之LengthFieldBasedFrameDecoder

    原文:https://www.jianshu.com/p/a0a51fd79f62 拆包的原理 关于拆包原理的上一篇博文 netty源码分析之拆包器的奥秘 中已详细阐述,这里简单总结下:netty的拆 ...

  5. 查看git提交细节

    git log git show fdf39277f54dd0484a9fefc012463924544e07af

  6. 苏州Uber优步司机奖励政策(4月24日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  7. 5249: [2018多省省队联测]IIIDX

    5249: [2018多省省队联测]IIIDX 链接 分析: 贪心. 将给定的权值从大到小排序,从第一个往后挨个赋值,考虑第i个位置可以赋值那些树.首先满足前面必须至少有siz[i]个权值没选,如果存 ...

  8. c#_导出table功能

    一:第一张导出方法,简单快捷 请注意:一般表格都有真分页,查询数据时候注意把分页条件去掉#region 此处是获取的list数组 然后转table再调用ExportExcel var list=&qu ...

  9. Shader开发之烘焙Lightmap自发光

    自己参考Build-in写了一套shader, 写完发现自发光部分在烘焙时不生效, 查阅资料发现需要在Material上设置为对应标记, 这部分功能可以像Standard Shader一样写在Shad ...

  10. CHAPTER 8 Out of Darkness 第8章 走出黑暗

    CHAPTER 8 Out of Darkness 第8章 走出黑暗 We expect scientists to be trying to discover new things, and for ...