详解promise、async和await的执行顺序
1、题目和答案
一道题题目:下面这段promise、async和await代码,请问控制台打印的顺序?
async function async1(){
console.log('async1 start')
await async2()
console.log('async1 end')
}
async function async2(){
console.log('async2')
}
console.log('script start')
setTimeout(function(){
console.log('setTimeout')
},0)
async1();
new Promise(function(resolve){
console.log('promise1')
resolve();
}).then(function(){
console.log('promise2')
})
console.log('script end')
上述,在Chrome 66
和node v10
中,正确输出是:
script start
async1 start
async2
promise1
script end
promise2
async1 end
setTimeout
2、知识点
显然,这考察的是js中的事件循环和回调队列。注意以下几点:
Promise
优先于setTimeout
宏任务。所以,setTimeout
回调会在最后执行。Promise
一旦被定义,就会立即执行。Promise
的reject
和resolve
是异步执行的回调。所以,resolve()
会被放到回调队列中,在主函数执行完和setTimeout
前调用。await
执行完后,会让出线程。async
标记的函数会返回一个Promise
对象
3、 难点
最令人困惑的,就是
async1 end
在promise2
之后输出
在函数async1
中,执行promise
(由于async2
是async
标记的函数,所以默认返回promise
对象)会发现resolve()
,然后放入回调队列。
接着执行下方的new Promise
中的resolve()
输出promise2
,再回来输出async1 end
。
其中,async1
函数可以写成以下方式(便于理解):
async function async1(){
console.log('async1 start')
async2().then( _ => {
console.log( 'async1 end ')
})
}
3、流程
console.log('script start')
输出:script start
setTimeout
被放在最后调用- 执行
async1
函数,输出async1 start
。然后,进入async2
函数,输出async2
,并返回Promise
对象。回到async1
,由于await
,让出线程,async2
函数返回的Promise
放在回调队列。 - 新new了一个
Promise
对象,输出promise1
。其中的resolve()
被放在回调队列。 console.log('script end')
输出:script end
- 执行回调队列中,
async1
返回的Promise
对象,对象产生的resolve
被放入对调队列。这里不输出任何值。 - 执行回调队列中,下方
Promise
显式声明的resolve
,输出promise2
。 - 执行回调队列中,由于
async1
函数返回的promise
对象的resolve
,输出async1 end
。 - 执行回调队列中,最后的
setTimeout
,输出setTimeout
- finish
4、参考
欢迎技术交流,引用请注明出处。
个人网站:godbmw.com
Github:godbmw
详解promise、async和await的执行顺序的更多相关文章
- async和await的执行顺序问题
说明 : 要了解执行顺序,所需要的知识是了解浏览器js运行机制,以及微任务和宏任务的先后顺序.如果你明白了宏任务.微任务,请往下看: async function async1 () { consol ...
- promise、async和await之执行顺序
async function async1(){ console.log('async1 start') await async2() console.log('async1 end') } asyn ...
- JS中的async/await的执行顺序详解
虽然大家知道async/await,但是很多人对这个方法中内部怎么执行的还不是很了解,本文是我看了一遍技术博客理解 JavaScript 的 async/await(如果对async/await不熟悉 ...
- setTimeout、Promise、Async/Await 的执行顺序
问题描述:以下这段代码的执行结果 async function async1() { console.log('async1 start'); await async2(); console.log( ...
- promise, async和await
最开始实现异步的方法:回调函数 method1(function(err, result) { if (err) { throw err; } method2(function(err, result ...
- ES系列之Promise async 和 await
概述 promise是异步编程的一种解决方案,比传统的解决方案—回调函数和事件—更合理更强大. 所谓的promise就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作的结果). Pro ...
- .net 关于Task.Run 和 Async await的执行顺序
一直捋不清楚用Task.Run异步的执行关系,网上找的些说明写得也有点复杂,所以自己做实验测一下. 直接上代码 这个是加await private static void TestFun() { Co ...
- JQuery中$.ajax()方法参数详解 及 async属性说明
url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...
- 道可道,非常道——详解promise
promise 出来已久,以前一直使用,没有仔细剖析原理,最近在复习es6的知识,写一下自己对于promise的理解. promise是es6的一种异步编程解决方案,避免频繁的回调函数,增强代码的可阅 ...
随机推荐
- 三.mysql表的完整性约束
mysql表的完整性约束 什么是约束 not null 不能为空的 unique 唯一 = 不能重复 primary key 主键 = 不能为空 且 不能重复 foreign key ...
- Linux-程序包管理
Linux上的软件安装有2种形式:源码.二进制文件,源码需要在编译环境下编译安装,二进制可以直接安装. 1.程序包管理器 rpm 程序包管理器能够将目标二进制格式(也就是从源码编译好的二进制文件,包括 ...
- CPP全面总结(涵盖C++11标准)
OOP之类和对象 1. this指针的引入 每个成员函数都有一个额外的隐含的形参,这个参数就是this指针,它指向调用对象的地址.默认情况下,this的类型是指向类类型非常量版本的常量指针.可以表示成 ...
- OCP 12c考试题,062题库出现大量新题-第20道
choose three Your database is configured for ARCHIVELOG mode, and a daily full database backup is ta ...
- Windows.UI.Cred.dll损坏导致不能设置 PIN 密码
心血来潮,重装系统. 然后发现不能设置 PIN,UWP界面在输完两个PIN后直接卡死(第一次设置的时候不需要输入第一行的PIN) google无果,打开系统日志,发现 上网下载一个对应版本的Windo ...
- setting-mirrorO以及下载jar包流程简介
mirrorOf常见的几种配置如下 1.* 2.repo3 3.repo1,repo2,*,!repo3 4.external:* 第二个例子只配置了一个repo3,这个镜像只能匹配id是repo3的 ...
- jvm加载类的7个步骤
- [EXP]XAMPP 5.6.8 - SQL Injection / Persistent Cross-Site Scripting
<!-- # Exploit Title: SQL injection (and previous) # Date: -- # Exploit Author: Rafael Pedrero # ...
- Python内置常量
引言 Python内置的常量不多,只有6个,分别是True.False.None.NotImplemented.Ellipsis.__debug__. 一. True 1. True是bool类型用来 ...
- WebView使用_WebView监听网页下载_DownloadManager使用
最近在做一个较简单的项目:通过一个webview来显示一个网页的App 这个网页有下载的功能,关于这一功能需要用到两个知识点: 1.webview监听网页的下载链接.(webview默认情况下是没有开 ...