
本文深入探讨 javascript 中 promise 异步函数的执行机制,特别是 `then` 方法如何与微任务队列(promisejob queue)协同工作。通过一个具体代码示例,我们将逐步解析代码执行流程、promise 状态变化以及回调函数入队与出队的时机,揭示 `console.log` 输出顺序背后的原理,帮助开发者掌握 promise 异步行为的精确控制。
JavaScript 是一种单线程语言,这意味着它一次只能执行一个任务。为了处理耗时的操作(如网络请求、文件读写),JavaScript 引入了异步编程机制。Promise 是 ES6 引入的一种处理异步操作的模式,它代表一个异步操作的最终完成(或失败)及其结果值。
理解 Promise 的执行顺序,关键在于把握 JavaScript 的事件循环(Event Loop)、调用栈(Call Stack)、微任务队列(Microtask Queue,也称 PromiseJob Queue)和宏任务队列(Macrotask Queue)的概念。
Promise 的核心特性:
为了更清晰地演示 Promise 的执行顺序,我们使用一个带有命名 Promise 和回调函数的示例代码:
立即学习“Java免费学习笔记(深入)”;
var a = Promise.resolve(); // Promise a 立即解决
var b = a.then(function a_then() {
console.log(1);
var c = Promise.resolve(); // Promise c 立即解决
var d = c.then(function c_then() {
console.log(2);
});
var e = d.then(function d_then() {
console.log(3);
});
console.log(4);
});
var f = b.then(function b_then() {
console.log(5);
var g = Promise.resolve(); // Promise g 立即解决
var h = g.then(function g_then() {
console.log(6);
});
var i = h.then(function h_then() {
console.log(7);
});
console.log(8);
});
console.log(9);我们将逐行分析这段代码的执行流程,并观察 console.log 的输出顺序。
以下是代码执行的详细步骤,关注调用栈、Promise 状态和微任务队列的变化:
阶段一:同步代码执行
var a = Promise.resolve();
var b = a.then(function a_then() { ... });
var f = b.then(function b_then() { ... });
console.log(9);
至此,所有同步代码执行完毕。调用栈清空,事件循环开始检查微任务队列。
阶段二:第一次微任务队列处理 (a_then)
事件循环从微任务队列中取出 a_then 并执行。
console.log(1); (在 a_then 内部)
var c = Promise.resolve();
var d = c.then(function c_then() { ... });
var e = d.then(function d_then() { ... });
console.log(4); (在 a_then 内部)
a_then 函数执行完毕,其返回值(undefined)用于解决 b。
阶段三:第二次微任务队列处理 (c_then)
事件循环从微任务队列中取出 c_then 并执行。
console.log(2); (在 c_then 内部)
c_then 函数执行完毕,其返回值(undefined)用于解决 d。
阶段四:第三次微任务队列处理 (b_then)
事件循环从微任务队列中取出 b_then 并执行。
console.log(5); (在 b_then 内部)
var g = Promise.resolve();
var h = g.then(function g_then() { ... });
var i = h.then(function h_then() { ... });
console.log(8); (在 b_then 内部)
b_then 函数执行完毕,其返回值(undefined)用于解决 f。
阶段五:第四次微任务队列处理 (d_then)
事件循环从微任务队列中取出 d_then 并执行。
console.log(3); (在 d_then 内部)
d_then 函数执行完毕,其返回值(undefined)用于解决 e。
阶段六:第五次微任务队列处理 (g_then)
事件循环从微任务队列中取出 g_then 并执行。
console.log(6); (在 g_then 内部)
g_then 函数执行完毕,其返回值(undefined)用于解决 h。
阶段七:第六次微任务队列处理 (h_then)
事件循环从微任务队列中取出 h_then 并执行。
console.log(7); (在 h_then 内部)
h_then 函数执行完毕,其返回值(undefined)用于解决 i。
最终输出顺序为:9, 1, 4, 2, 5, 8, 3, 6, 7。
通过以上详细的步骤分析,我们可以清晰地看到 JavaScript Promise 异步机制的内部工作原理,特别是微任务队列在调度 Promise 回调中的核心作用。掌握这些概念对于编写健壮、可预测的异步 JavaScript 代码至关重要。
以上就是深入理解 JavaScript Promise 异步执行顺序与微任务队列的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号