当前位置: 首页 > news >正文

JavaScript 中 多个 Promise 嵌套中,如何保证正确的执行顺序?

代码示例

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

执行顺序解析

同步代码执行:

1.首先执行 console.log(1);,输出 1。
遇到 setTimeout,将其回调放入宏任务队列。
Promise.resolve().then() 把回调放入微任务队列。
new Promise 内部同步代码 console.log(10); 执行,输出 10,并将其 .then() 回调放入微任务队列。
执行 console.log(12);,输出 12。
2.微任务执行:
依次执行微任务队列中的回调,输出 6、11、9。在输出 6 时,内部 setTimeout 回调放入宏任务队列。
3.宏任务及后续微任务执行:
执行宏任务队列中的第一个 setTimeout 回调,输出 2,其内部 Promise.resolve().then() 回调放入微任务队列。
执行 Promise.resolve().then() 的第一个回调,输出 3,其内部 setTimeout 回调放入宏任务队列,接着执行第二个 .then() 回调,输出 5。
执行全局 Promise then 1 里 setTimeout 的回调,输出 7,其内部 Promise.resolve().then() 回调放入微任务队列并执行,输出 8。
执行前面 Promise then 1 里 setTimeout 的回调,输出 4。
最终输出顺序:1,10,12,6,11,9,2,3,5,7,8,4
http://www.dtcms.com/a/29276.html

相关文章:

  • Python学习心得面向对象的三大特征
  • Linux应急响应-系统排查
  • 【清华大学】DeepSeek从入门到精通完整版pdf下载
  • web网络安全:SQL 注入攻击
  • AI助力下的PPT革命:DeepSeek 与Kimi的高效创作实践
  • 测试面试及实用功能解读
  • Jenkins 创建 Node 到 Windows
  • 【Java八股文】08-计算机网络面试篇
  • 【C++】面向对象的三大特性
  • 企业存储系统
  • windows环境下用docker搭建php开发环境dnmp
  • armv7l
  • 蓝桥杯学习大纲
  • 使用jenkins构建Android+Flutter项目依赖自动升级带来兼容性问题及Jenkins构建速度慢问题解决
  • 基于射频开关选择的VNA校准设计
  • vue3 背景虚化,文字高亮效果
  • git输错用户名或者密码
  • 连续学习、增量学习有哪些应用场景?
  • JavaScript系列(77)-- Web Components 深入解析
  • vue3引用vue-ueditor-wrap组件
  • Log4j在Spring项目中的应用与实践
  • 钉钉多维表:数据管理与协作的新篇章
  • 数仓搭建(hive):DWB层(基础数据层)
  • 【核心算法篇九】《DeepSeek联邦学习:医疗数据隐私保护实战》
  • Spring IoC DI
  • 腿足机器人之十- SLAM地图如何用于运动控制
  • Compose 定制UI视图
  • Golang通过 并发计算平方 示例演示并发
  • 【Linux】Linux 文件系统——有关 inode 不足的案例
  • Golang实现简单的接口去重函数