帖子
帖子
用户
博客
课程
显示全部楼层
10
帖子
0
勋章
117
Y币

[FAQ] 如何理解JS中执行的同步与异步这个问题

[复制链接]
发表于 2017-12-8 15:13:04
本帖最后由 前方 于 2017-12-8 15:18 编辑

很多人会遇到这样的问题,这在我们的app开发中经常碰到,“同步与异步”。理论知识很重要,仔细阅读下面的有关解释。
Javascript语言的执行环境是"单线程"(single thread)。
所谓"单线程",就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。
这种模式的好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其他任务无法执行。
为了解决这个问题,Javascript语言将任务的执行模式分成两种:同步(Synchronous)和异步(Asynchronous)
"同步模式"就是上一段的模式,后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的;"异步模式"则完全不同,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。
"异步模式"非常重要。在浏览器端,耗时很长的操作都应该异步执行,避免浏览器失去响应,最好的例子就是Ajax操作。在服务器端,"异步模式"甚至是唯一的模式,因为执行环境是单线程的,如果允许同步执行所有http请求,服务器性能会急剧下降,很快就会失去响应。

下面有实例解释:
01.png

当点击button触发submit方法的时候,会怎么样?


报错!!!


因为取不到a、b的值,可不报错嘛。

虽然你定义了global,一片好心,可是无济于事。

这些都是我们想当然的觉得可以这样写,但是程序执行不是这样的的!

正确的做法,将function A , function B 中的方法体整合进submit方法中去,按顺序同步执行。


下面贴出线上应用中的代码,供学习使用

1.png
2.png
3.png



注释中已经标识了:
step1 让用户确认是否同意支付;
step2 判断用户口袋里面还有多少钱;
step3 获取支付Hash,这个在step4中需要;
step4 提交订单;

像这样的,下一个方法需要上一个方法中的返回值,只能使用同步方式;虽然可以抽出来独立为函数,但是,NO!

当初submit方法也是按照本文开头讲的那样,分开的。但是无数次的尝试后,最终只有也只能这么写才是最完美的。

后端接口需要注意的,以下适合后端程序员阅读


Hash的作用会根据每一笔订单产生不同的hash,防止订单被篡改、收货地址、支付金额、商品数量被篡改
这个要求贵公司的后台技术做到万无一失
以下贴出我后台的相关接口,进攻参考学习,使你对前端更加深入理解的流程的执行

前端直接调用的接口 是下面的这个方法

4.png

而方法中调用另外一个支持依赖方法

5.png




应用宝、华为、小米、360、豌豆荚等应用市场搜索“猜客”,体验下流畅的感觉吧


3
帖子
0
勋章
4582
Y币
感谢分享
1682
帖子
10
勋章
4582
Y币
感谢分享
177
帖子
0
勋章
1万+
Y币
支持,赞一个。
18
帖子
1
勋章
106
Y币
感谢分享
258
帖子
4
勋章
1024
Y币
看了你主页全都是JS教程。这个教程都是JS语言,搜索JS教程一大把,和apicloud没关系,这文章有什么意义?
建议出apicloud相关教程,比如模块,实现效果等
58
帖子
2
勋章
1554
Y币
没什么意义,一会js ,一会php
您需要登录后才可以回帖 登录

本版积分规则