setTimeout,promise,promise.then, async,await执行顺序问题
今天下午看了好多关于这些执行顺序的问题 经过自己的实践 终于理解了 记录一下
就拿网上出现频繁的代码来说:
async function async1() {
console.log('async1 start');
await async2();
console.log('asnyc1 end');
}
async function async2() {
console.log('async2');
}
console.log('script start');
setTimeout(() => {
console.log('setTimeOut');
}, 0);
async1();
new Promise(function (reslove) {
console.log('promise1');
reslove();
}).then(function () {
console.log('promise2');
})
console.log('script end');
然后是结果:
script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout
理解:
js事件分两种: 宏任务(macro task) 和 微任务(micro task)
宏任务包括: script(读取 执行script代码也算一种任务) setTimeout setInterval
微任务包括:promise.then(注意是promise.then) , process.nextTick
事件执行顺序: 先执行宏任务, 然后执行微任务
任务执行顺序:先执行同步代码,后执行异步代码
上述代码的同步代码有哪些呢:
console.log('script start');
async1();
console.log('async1 start');
console.log('async2');
console.log('promise1');
console.log('script end');
值得注意的是
1. async声明的函数
如果没有await 跟普通函数一样
如果存在await await之前的代码包括await紧跟的这个函数都是同步执行的
await执行async2这个函数之后await让出了线程,把返回的promise加入了微任务异步队列,所以async1()下面的代码也要等待上面完成后继续执行;
(自己理解:
上述代码中 由于在执行async2之前 还没有执行new Promise 所以不会把promise.then这个微任务添加到异步队列中
善于动手的小伙伴可以试着 把 new Promise那段代码放到async1();之前 会返现执行顺序不一样
)
2. new Promise()是声明就立即执行的, promise.then才是异步;
然后是异步代码:
promise.then
setTimeout
以上是自己的实践➕理解 如有不对 请大神纠正
async function async1(){
console.log('a1 start');
await async2();
console.log('a1 end');
}
async function async2(){
console.log('async2');
}
new Promise((resolve) => {
console.log('promise1');
resolve();
}).then(() => {
console.log('promise1 then');
});
async1();
new Promise((resolve) => {
console.log('promise2');
resolve();
}).then(() => {
console.log('promise2 then');
});
执行这段代码 你会发现 promise.then 和 await之间的微妙关系
setTimeout,promise,promise.then, async,await执行顺序问题的更多相关文章
- Promise嵌套问题/async await执行顺序
/* 原则: 执行完当前promise, 会把紧挨着的then放入microtask队尾, 链后面的第二个then暂不处理分析, */ 一. new Promise((resolve, reject) ...
- async/await 执行顺序详解
随着async/await正式纳入ES7标准,越来越多的人开始研究据说是异步编程终级解决方案的 async/await.但是很多人对这个方法中内部怎么执行的还不是很了解,本文是我看了一遍技术博客理解 ...
- 错误的理解引起的bug async await 执行顺序
今天有幸好碰到一个bug,让我知道了之前我对await async 的理解有点偏差. 错误的理解 之前我一直以为 await 后面的表达式,如果是直接返回一个具体的值就不会等待,而是继续执行asyn ...
- 事件循环 EventLoop(Promise,setTimeOut,async/await执行顺序)
什么是事件循环?想要了解什么是事件循环就要从js的工作原理开始说起: JS主要的特点就是单线程,所谓单线程就是进程中只有一个线程在运行. 为什么JS是单线程的而不是多线程的呢? JS的主要用途就是与用 ...
- promise.then, setTimeout,await执行顺序问题
promise.then VS setTimeout 在chrome和node环境环境中均输出2, 3, 1, 先输出2没什么好说的,3和1顺序让人有些意外 原因: 有一个事件循环,但是任务队列可以有 ...
- javascript ES6 新特性之 Promise,ES7 async / await
es6 一经推出,Promise 就一直被大家所关注.那么,为什么 Promise 会被大家这样关注呢?答案很简单,Promise 优化了回调函数的用法,让原本需要纵向一层一层嵌套的回调函数实现了横向 ...
- async和await执行顺序
关于执行顺序和线程ID,写了一个小程序来检测学习: using System; using System.Net; using System.Threading; using System.Threa ...
- promise async await使用
1.Promise (名字含义:promise为承诺,表示其他手段无法改变) Promise 对象代表一个异步操作,其不受外界影响,有三种状态: Pending(进行中.未完成的) Resolved( ...
- JS中的async/await的执行顺序详解
虽然大家知道async/await,但是很多人对这个方法中内部怎么执行的还不是很了解,本文是我看了一遍技术博客理解 JavaScript 的 async/await(如果对async/await不熟悉 ...
随机推荐
- TensorFlow.训练_资料(有视频)
ZC:自己训练 的文章 貌似 能度娘出来很多,得 自己弄过才知道哪些个是坑 哪些个好用...(在CSDN文章的右侧 也有列出很多相关的文章链接)(貌似 度娘的关键字是"TensorFlow ...
- twig 模板控制器对应列表
{{ render(controller(metas.header,{request:app.request, course: course, member: member|default(null) ...
- 2、PHP变量
2.1含义与定义形式 就是使用一个“标记符号”(标识符),来代表某个数据. 类比: 用一个名字(姓名),来代表某个人. 用一个身份证号码,来代表某个人... 用一个变量,就可以理解为“使用一个数据”. ...
- pacemaker入门
原文链接:https://blog.csdn.net/a964921988/article/details/82628478 因为数据库部署在Linux上,需要做数据库集群实现高可用,而所有的Post ...
- bootstrap导航栏PC端移动端之不同样式
在此之前,我先说我之所以要改变网站PC移动双端不同样式的原因. 首先我的网站用到了bootstrap响应式布局,这是我网站的PC端导航栏: 这是我网站的移动端导航栏,看着就难受: 我用谷歌浏览器F12 ...
- [转帖]IIS7配置Gzip压缩
IIS7配置Gzip压缩 https://www.cnblogs.com/coce/p/6804373.html II7中自带了gzip功能,理论上应该比ii6配置起来应该简单一点,但是容易出的问 ...
- centos7ping www.baidu.com没有ping通
在linux中ping www.baidu.com 无法ping通,可能原因是DNS没配置好 1.修改vi /etc/resolv.conf 增加如下内容: nameserver 114.114.11 ...
- ThreadLocal父子线程之间的数据传递问题
一.问题的提出 在系统开发过程中常使用ThreadLocal进行传递日志的RequestId,由此来获取整条请求链路.然而当线程中开启了其他的线程,此时ThreadLocal里面的数据将会出现无法获取 ...
- ibox 的使用
<div class="ibox float-e-margins"> <div class="ibox-title"> <h5&g ...
- Education Reform(CodeForces-119C)【DP】
题意:从m门课选出n个排到n天,每天一门,难度须递增,每门课对应着一个作业量Xi,且Xi = Xi-1 + k or Xi - Xi-1 * k,总作业量要尽可能大,问能否排布,若能排布,求方案. 思 ...