Promise回调执行位置及async/await执行机制相关技术问询
Promise回调与async/await的执行机制解析
1. then/catch/finally回调的执行位置
这些回调确实运行在JS主线程的调用栈中——JS是单线程模型,所有JS代码最终都要通过主线程调用栈执行,Promise回调也不例外。
2. 回调是否在调用栈为空后执行
是的,这要结合JS的事件循环机制来看:
- Promise的回调属于微任务(Microtasks),当Promise状态变更后,对应的回调会被加入微任务队列。
- 主线程会先执行完当前调用栈内的所有同步代码,直到调用栈清空,才会依次取出微任务队列里的任务推入调用栈执行。
- 只有微任务队列处理完毕后,才会去处理宏任务队列(比如setTimeout、DOM事件回调等)。
举个直观的例子:
console.log('同步代码1'); Promise.resolve().then(() => { console.log('Promise回调执行'); }); console.log('同步代码2');
实际执行顺序是:同步代码1 → 同步代码2 → Promise回调执行,原因就是同步代码先占满调用栈执行,空栈后才处理微任务。
3. async/await是否遵循相同机制
完全适用,因为async/await本质是Promise的语法糖,底层逻辑和Promise一致:
await后的表达式会被包装为Promise,当该Promise状态变为resolved时,await之后的代码会被加入微任务队列。- 主线程同样会先执行完当前调用栈的同步代码,空栈后再处理这些微任务。
示例代码:
async function demo() { console.log('async内部同步代码'); await Promise.resolve(); console.log('await之后的代码'); } console.log('外部同步代码'); demo(); console.log('外部同步代码2');
执行顺序为:外部同步代码 → async内部同步代码 → 外部同步代码2 → await之后的代码,和Promise微任务的执行逻辑完全一致。
内容的提问来源于stack exchange,提问作者user19551894
相关产品推荐
相关产品推荐

