IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Promise函数执行顺序 -> 正文阅读

[JavaScript知识库]Promise函数执行顺序

首先执行同步代码, promise() 构造函数中的代码是同步代码, .then和.catch里的是异步代码.
执行顺序:
已申明的函数–>new Promise–>setTimeout;在Promise函数中后执行.then()函数;

    testFunction() {
      console.log(`console 1`);
      setTimeout(() => {
          new Promise(() => {
              console.log(`console 10`);
          }).then(console.log(`console 11`));
      },0);
      new Promise((resolve, reject) => {
          console.log(`console 2`);
          resolve(console.log(`console 3`));
          reject(console.log(`console 4`))
      }).then(() => {
          setTimeout(() => {
              console.log(`console 7`);
              new Promise(() => {
                  console.log(`console 8`)
              }).then(console.log(`console 9`))
          },0)
      }).catch(() => {
          console.log(`consolve 5`)
      });
      console.log(`console 6`)
    }//-->console 1;console 2;console 3;console 4;console 6;console 10;console 11;console 7;console 8;console 9

例题

setImmediate(function(){

console.log(1);

},0);

setTimeout(function(){

console.log(2);

},0);

new Promisefunction(resolve){

console.log(3);

resolve();

console.log(4);

}.then(function(){

console.log(5);

});

console.log(6);

process.nextTick(function(){

console.log(7);

});

console.log(8);

输出结果: 3 4 6 8 7 5 2 1

  • macro-task: script (整体代码),setTimeout, setInterval, setImmediate, I/O, UI rendering.
  • micro-task: process.nextTick, Promise(原生),Object.observe,MutationObserver

第一步: script整体代码被执行,执行过程为

创建setImmediate macro-task
创建setTimeout macro-task
创建micro-task Promise.then 的回调,并执行script console.log(3); resolve(); console.log(4); 此时输出3和4,虽然resolve调用了,执行了但是整体代码还没执行完,无法进入Promise.then 流程。
console.log(6)输出6
process.nextTick 创建micro-task
console.log(8) 输出8

第一个过程过后,已经输出了3 4 6 8

第二步: 由于其他micro-task 的 优先级高于macro-task。

此时micro-task 中有两个任务按照优先级process.nextTick 高于 Promise,所以先输出7,再输出5

第三步: micro-task 任务列表已经执行完毕,家下来执行macro-task. 由于setTimeout的优先级高于setIImmediate,所以先输出2,再输出1。

参考: https://www.php.cn/js-tutorial-413156.html

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-15 11:41:41  更:2021-10-15 11:42:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 14:19:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码