MDN中Promise executor内部操作异步表述的含义疑问
你对文档表述的理解存在偏差,Promise构造函数传入的executor函数本身是同步执行的,所谓的「executor内部的操作是异步的」指的是executor的设计用途是包裹需要异步执行的任务(比如网络请求、定时器这类),而非executor本身会被异步调用。
你的测试代码执行逻辑拆解
- 首先执行同步代码
console.log('before promise'),输出对应内容。 - 调用
new Promise()时,传入的executor函数会立即同步执行:- 先执行
console.log('promise')输出对应内容 - 执行大循环,此时JS主线程被阻塞,不会处理后续代码
- 调用
resolve(1),仅将Promise状态改为已兑现,把then的回调推入微任务队列,不会立即执行回调 - 执行
console.log('promise end')输出对应内容,executor执行完成
- 先执行
- 继续执行主线程剩余同步代码
console.log('not promise but after'),输出对应内容。 - 所有同步代码执行完毕后,JS才会清空微任务队列,执行
then的回调,输出then,和你观测的输出顺序完全一致。
文档表述的正确含义
文档中提到的「executor内部的操作是异步的且会提供一个回调」,指的是executor的典型使用场景是包裹自带回调的异步任务,你需要在这些异步任务的回调中调用resolve/reject来变更Promise状态,而非executor本身是异步执行的。
举个符合典型场景的例子:
console.log('before promise'); new Promise(function(resolve, reject) { console.log('promise'); // executor内部包裹异步任务setTimeout,它的回调才是异步执行的 setTimeout(() => { resolve(1); console.log('async op end'); }, 0) console.log('promise end'); }).then(function() { console.log('then'); }); console.log('not promise but after');
这段代码的输出顺序为:
- before promise
- promise
- promise end
- not promise but after
- async op end
- then
这才符合你最初预想的异步执行效果。
内容的提问来源于stack exchange,提问作者olevacho
相关产品推荐
相关产品推荐

