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,总作业量要尽可能大,问能否排布,若能排布,求方案. 思 ...