You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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()

疑问解答

  1. 为何Promise的resolve函数调用后返回假值?
    根据ECMAScript标准,Promise的resolve()函数本身的返回值就是undefined,而undefined属于假值(falsy value),所以用const v = resolve(...)得到的v就是undefined,自然会触发!v的判断。

  2. 尽管.then()中的回调函数明确返回true,为何Promise执行器内的if语句仍会执行?
    两者没有关联。Promise的执行器函数(new Promise()传入的回调)是同步执行的——在创建Promise的瞬间,执行器里的代码就已经全部跑完了。而.then()里的回调是异步微任务,要等当前所有同步代码执行完毕才会触发。等执行器里的if语句执行时,.then的回调还没开始运行,它返回的true根本影响不到执行器里的代码。

  3. resolve调用后紧跟的if语句为何先于.then()回调执行?
    核心是同步任务与异步微任务的执行顺序差异:

  • 执行器里的代码属于同步任务,会直接进入调用栈立即执行;
  • .then()注册的回调属于微任务,会被加入微任务队列,只有当调用栈中的所有同步任务执行完毕、栈为空时,才会依次执行微任务队列里的任务。
    所以执行器里的if语句先执行,等它跑完后,才会轮到.then的回调执行。

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 05:25:14