一篇文章彻底搞懂异步,同步,setTimeout,Promise,async
之前翻看别的大佬的博客看到了关于setTimeout,promise还有async执行顺序的文章。观看了几篇之后还是没有怎么看懂,于是自己开始分析代码,并整理了此文章,我相信通过此文章朋友们能对异步同步还有,setTimeout,Promise,async这些内容了然于胸,接下来让我们走入正题:
这是别的大佬博客里面的代码:
async function async1() {
console.log('async1 start')
await async2()
console.log('async1 end')
}
async function async2() {
console.log('async2')
}
console.log('script start')
setTimeout(() => {
console.log('setTimeout')
},0)
async1()
new Promise((resolve) => {
console.log('promise1')
resolve()
}).then(() => {
console.log('promise2')
})
console.log('script end')
执行结果(不同浏览器执行结果可能不同,笔者用的谷歌):
PS:下面的关键点笔者都用加粗给朋友们圈起来了哦,请仔细观看
笔者这时候开启了双屏模式,看它的这个代码的执行结果去猜它的规律,然后再看MDN文档,结果就一目了然了。
我们现在一起来分析代码:
这只是定义了俩个异步函数(),并没有调用,所以暂时不用管。
这是同步的内容,所以会直接执行
1.输出 script start
setTimeout是一个计时器,异步的,所以被扔到了任务队列里面,暂时不去管,我们只需要记住异步队列里面有他就可以。
调用了async1函数,会走入到这个函数里,我们先再看一下这个函数:
PS:注意点:
当调用async函数的时候会返回一个Promise对象。Promise对象是立即执行的,后面会详细介绍。
这时候会
2.输出async1 start,
而后到了await async2()
这里需要注意一下,在async里遇到await它会使async函数暂停执行,执行完async里的await内容后将后续的内容扔入到浏览器的任务队列里面去。
所以这里输出了async1 start后又
3.输出了async2
async2执行完毕之后又走回到调用了async1的位置。将async1没有执行的部分扔到了任务队列里面去。(现在任务队列里面有一个setTimeout和一个async1的后续内容)
接下来又走到了Promise:
Promise是立即执行的,所以它会立即
4.输出promise1。
而后是执行了resolve。执行成功,执行成功的话会走入promise的.then方法里,可是它是异步的回调函数,所以会被丢入到任务队列里。(现在任务队列里面有一个setTimeout和一个async1的后续内容在加上promise的.then内容)
最后走到了:
因为它是同步的,所以会直接执行。
5.输出:script end
前五个我们都分析完毕了,接下来到关键点了:
现在异步队列中有三个任务分别是:
setTimeout
async1的后续内容
promise的.then内容
这三个内容setTimeout会在最后执行,就好比css权重的优先级,大家固定记住就可以,setTimeout的优先级没有async和promise级别高(其实async和promise是一样的,因为调用async方法时就是返回一个promise对象)
而后async和promise的.then就看谁先进入到的任务队列里面,任务队列里面有先进先出的概念。所以结果很明显了,它们三个的输出顺序是:
6.输出:async1 end
7.输出:promise2
8.输出:setTimeout
在给朋友们随便写一个代码,大家一起猜一下执行结果会是什么:
setTimeout(() => {
console.log('setTimeout')
}, 0)
console.log('t1')
fetch('http://dict.qq.com')
.then(function(response) {
return response.json();
})
.then(function(myJson) {
console.log('myJson');
})
.catch(function(err) {
console.log(err)
})
console.log('fetch zhi hou')
async function async1() {
console.log('async1 start')
await async2()
console.log('async1 end')
}
async1()
console.log('t2')
new Promise((resolve) => {
console.log('promise')
resolve()
}).then(() => {
console.log('promise.then')
})
console.log('t3')
async function async2() {
console.log('async2')
}
console.log('t4')
执行结果:
最后依次执行fetch的 .then / .catch
一篇文章彻底搞懂异步,同步,setTimeout,Promise,async的更多相关文章
- 一篇文章彻底搞懂base64编码原理
开始 在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇文章带领大家了解一下Base64的底层实现. base64是什么东东呢? Base64 ...
- 一篇文章彻底搞懂es6 Promise
前言 Promise,用于解决回调地狱带来的问题,将异步操作以同步的操作编程表达出来,避免了层层嵌套的回调函数. 既然是用来解决回调地狱的问题,那首先来看下什么是回调地狱 var sayhello = ...
- 一篇文章彻底搞懂snowflake算法及百度美团的最佳实践
写在前面的话 一提到分布式ID自动生成方案,大家肯定都非常熟悉,并且立即能说出自家拿手的几种方案,确实,ID作为系统数据的重要标识,重要性不言而喻,而各种方案也是历经多代优化,请允许我用这个视角对分布 ...
- 一篇文章快速搞懂什么是GitHub
导读:什么是GitHub?Git与GitHub之间是什么关系?我们为什么需要版本控制系统?GitHub如何使用?本文将带你一探究竟. 本文字数:1710,阅读时长大约:13分钟 一.什么是版本控制 按 ...
- 一篇文章彻底搞懂Java的大Class到底是什么
作者在之前工作中,面试过很多求职者,发现有很多面试者对Java的 Class 搞不明白,理解的不到位,一知半解,一到用的时候,就不太会用. 因为自己本身以前刚学安卓的时候,甚至做安卓2,3年后,也是对 ...
- 一篇文章快速搞懂Redis的慢查询分析
什么是慢查询? 慢查询,顾名思义就是比较慢的查询,但是究竟是哪里慢呢?首先,我们了解一下Redis命令执行的整个过程: 发送命令 命令排队 命令执行 返回结果 在慢查询的定义中,统计比较慢的时间段指的 ...
- 一篇文章快速搞懂 Atomic(原子整数/CAS/ABA/原子引用/原子数组/LongAdder)
前言 相信大部分开发人员,或多或少都看过或写过并发编程的代码.并发关键字除了Synchronized,还有另一大分支Atomic.如果大家没听过没用过先看基础篇,如果听过用过,请滑至底部看进阶篇,深入 ...
- 一篇文章快速搞懂Qt文件读写操作
导读:Qt当中使用QFile类对文件进行读写操作,对文本文件也可以与QTextStream一起使用,这样读写操作会更加简便.QFileInfo可以用来获取文件的信息.QDir可以用于对文件夹进行操作. ...
- 一篇文章快速搞懂 Apache SkyWalking 的 OAL
OAL简介 在流模式(Streaming mode)下,SkyWalking 提供了 观测分析语言(Observability Analysis Language,OAL) 来分析流入的数据. OAL ...
随机推荐
- HTML Button自动刷新页面的问题
一.问题<button class="am-btn am-btn-default am-btn-xs am-text-secondary" data-id="99& ...
- spark简单文件配置
cd /usr/local/spark/spark-2.2.1-bin-hadoop2.7/conf cp slaves.template slaves cp spark-env.sh.templat ...
- 我的iOS动画01
1.嵌套使用,先变大再消失 [UIView animateWithDuration:1.25 aniamtions:^{ CGAffineTransform newTRansform = CGAffi ...
- SpringCloud学习成长之路七 高可用配置中心
上一篇文章讲述了一个服务如何从配置中心读取文件,配置中心如何从远程git读取配置文件,当服务实例很多时,都从配置中心读取文件,这时可以考虑将配置中心做成一个微服务,将其集群化,从而达到高可用,架构图如 ...
- python之socket编程(二)
标签(空格分隔): socket编程 SocketServer解析 SocketServer内部使用I/O多路复用,多线程,多进程来实现客户端多并发访问Socket服务端,while循环时使用I/O多 ...
- 重装GUI前备份GUI配置
sap系统要重装, gui配置 想要保存,这个要怎么弄? SAP菜单 选项-> 本地数据 -> 历史记录 里的地址 C:\Users\Administrator\AppData\Roam ...
- Ubuntu LVS DR模式生产环境部署
1.环境说明 系统版本:ubuntu14.04 LVS服务器:14.17.64.3 真实服务器:14.17.64.4-12 VIP:14.17.64.13 部署目的:用户请求14.17.64.13的报 ...
- python选课系统demo的小练习
#简化选课系统代码:先登陆,然后判断身份并实例化,根据身份对应的类,让用户选择 class Manager: operate_dict=[ ('创造学生账号',"creat_student& ...
- Fiddler之基础:面板、图标介绍
1.面板介绍:菜单栏,工具栏,回话面板,监控面板 2.工具栏-图标 3.会话面板-图标 4.监控面板 5.状态栏 控制台Fiddler的左下角有一个命令行工具叫做QuickExec,允许你直接输入命令 ...
- python学习-23 函数
函数 1.函数分为:数学定义的函数和编程语言中的函数 例如: - 数学定义的函数:y=2*x+1 - 编程语言的函数: def test(x): x += 1 return x def :定义函数的 ...