今天下午看了好多关于这些执行顺序的问题  经过自己的实践 终于理解了  记录一下
就拿网上出现频繁的代码来说:

  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执行顺序问题的更多相关文章

  1. Promise嵌套问题/async await执行顺序

    /* 原则: 执行完当前promise, 会把紧挨着的then放入microtask队尾, 链后面的第二个then暂不处理分析, */ 一. new Promise((resolve, reject) ...

  2. async/await 执行顺序详解

    随着async/await正式纳入ES7标准,越来越多的人开始研究据说是异步编程终级解决方案的 async/await.但是很多人对这个方法中内部怎么执行的还不是很了解,本文是我看了一遍技术博客理解 ...

  3. 错误的理解引起的bug async await 执行顺序

    今天有幸好碰到一个bug,让我知道了之前我对await async 的理解有点偏差. 错误的理解 之前我一直以为  await 后面的表达式,如果是直接返回一个具体的值就不会等待,而是继续执行asyn ...

  4. 事件循环 EventLoop(Promise,setTimeOut,async/await执行顺序)

    什么是事件循环?想要了解什么是事件循环就要从js的工作原理开始说起: JS主要的特点就是单线程,所谓单线程就是进程中只有一个线程在运行. 为什么JS是单线程的而不是多线程的呢? JS的主要用途就是与用 ...

  5. promise.then, setTimeout,await执行顺序问题

    promise.then VS setTimeout 在chrome和node环境环境中均输出2, 3, 1, 先输出2没什么好说的,3和1顺序让人有些意外 原因: 有一个事件循环,但是任务队列可以有 ...

  6. javascript ES6 新特性之 Promise,ES7 async / await

    es6 一经推出,Promise 就一直被大家所关注.那么,为什么 Promise 会被大家这样关注呢?答案很简单,Promise 优化了回调函数的用法,让原本需要纵向一层一层嵌套的回调函数实现了横向 ...

  7. async和await执行顺序

    关于执行顺序和线程ID,写了一个小程序来检测学习: using System; using System.Net; using System.Threading; using System.Threa ...

  8. promise async await使用

    1.Promise (名字含义:promise为承诺,表示其他手段无法改变) Promise 对象代表一个异步操作,其不受外界影响,有三种状态: Pending(进行中.未完成的) Resolved( ...

  9. JS中的async/await的执行顺序详解

    虽然大家知道async/await,但是很多人对这个方法中内部怎么执行的还不是很了解,本文是我看了一遍技术博客理解 JavaScript 的 async/await(如果对async/await不熟悉 ...

随机推荐

  1. 深入剖析Java虚拟机内存结构

    深入剖析Java虚拟机内存模型 JVM整体架构 JVM整体架构如下: 通过编写代码来分析整个内存区域 public class Math { public static final Integer C ...

  2. c++ hex string array 转换 串口常用

    c++ hex string array 转换 效果如下 tset string is follow 0x50 55 0x35 00 10 203040506073031323334ff format ...

  3. NameNode 和 SecondaryNameNode

    1. NN 和 2NN 工作机制 NameNode 会产生在磁盘中备份元数据的FsImage; 每当元数据有更新或者添加数据时,修改内存中的元数据并追加到Edits中; SecondaryNameNo ...

  4. Django生成数据表时报错

    Django生成数据表时报错 WARNINGS: ?: (mysql.W002) MySQL Strict Mode is not set for database connection 'defau ...

  5. Python实现二叉树的非递归中序遍历

    思路: 1. 使用一个栈保存结点(列表实现): 2. 如果结点存在,入栈,然后将当前指针指向左子树,直到为空: 3. 当前结点不存在,则出栈栈顶元素,并把当前指针指向栈顶元素的右子树: 4. 栈不为空 ...

  6. 常见三种加密(MD5、非对称加密,对称加密)

    转载. https://blog.csdn.net/SSY_1992/article/details/79094556 任何应用的开发中安全都是重中之重,在信息交互异常活跃的现在,信息加密技术显得尤为 ...

  7. Escape(多记一个方向状态的BFS)迷宫逃脱

    题意:https://www.nitacm.com/problem_show.php?pid=2266 vis记[x][y][dir]三个状态就行. 引用:https://blog.csdn.net/ ...

  8. 封装PHP增删改查方法

    <?php class sqlModel{ public $db; public function __construct(){ try{ $dbms='mysql';//数据库类型 $dbNa ...

  9. Microsoft SQL Server 2008 R2 Express and Management Studio Express

    https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads Microsoft SQL Server 2008 R2 RTM - E ...

  10. 怎样实现跨域AJAX请求发送Cookie

    第一步: 服务器必须在Response Header中设置: Access-Control-Allow-Credentials: true 第二步: 客户端发起请求时需要将 xhr.withCrede ...