为何Promise的resolve函数返回假值?执行顺序及then回调疑问
关于Promise执行器与resolve的几个问题解答
代码示例
new Promise((resolve) => { const v = resolve("called resolve()"); if (!v) { console.log("resolve() returned a falsey value"); } }).then((value) => { console.log(value); return true; });
输出结果
resolve() returned a falsey value called resolve()
疑问解答
为何Promise的resolve函数调用后返回假值?
根据ECMAScript标准,Promise的resolve()函数本身的返回值就是undefined,而undefined属于假值(falsy value),所以用const v = resolve(...)得到的v就是undefined,自然会触发!v的判断。尽管.then()中的回调函数明确返回true,为何Promise执行器内的if语句仍会执行?
两者没有关联。Promise的执行器函数(new Promise()传入的回调)是同步执行的——在创建Promise的瞬间,执行器里的代码就已经全部跑完了。而.then()里的回调是异步微任务,要等当前所有同步代码执行完毕才会触发。等执行器里的if语句执行时,.then的回调还没开始运行,它返回的true根本影响不到执行器里的代码。resolve调用后紧跟的if语句为何先于.then()回调执行?
核心是同步任务与异步微任务的执行顺序差异:
- 执行器里的代码属于同步任务,会直接进入调用栈立即执行;
.then()注册的回调属于微任务,会被加入微任务队列,只有当调用栈中的所有同步任务执行完毕、栈为空时,才会依次执行微任务队列里的任务。
所以执行器里的if语句先执行,等它跑完后,才会轮到.then的回调执行。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

