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

添加Promise代码后程序为何立即执行?原预期两次4秒延迟

Promise创建后立即执行?踩过这个坑的来给你捋清楚!

嘿,我太懂你这种困惑了!当初刚上手Promise的时候,我也被这个“立即执行”的特性坑过好几次😅

咱们先直击核心问题:当你用new Promise(executor)创建Promise实例时,里面的executor函数(就是你写的那个带resolve/reject的回调)会在创建Promise的瞬间立刻执行,不管你有没有给这个Promise绑定.then()或者.catch()回调。

举个你可能写的错误示例(模拟你的场景):

// 错误写法:直接创建Promise实例
const wait4Seconds = new Promise((resolve) => {
  console.log("开始计时");
  setTimeout(() => {
    console.log("计时结束");
    resolve();
  }, 4000);
});

// 你以为会先等4秒,再等4秒?
wait4Seconds.then(() => console.log("第一次完成"));
wait4Seconds.then(() => console.log("第二次完成"));

这段代码运行时,wait4Seconds这个Promise在创建的那一刻就已经启动了setTimeout,两个.then()只是在同一个Promise完成后触发回调,所以实际是4秒后两个“完成”同时打印,而不是先后各等4秒。

正确的做法:把Promise包装成函数

要实现两次独立的4秒延迟(或者顺序的两次延迟),你需要把Promise的创建逻辑放进一个函数里,每次调用函数才会创建新的Promise实例,这样每次调用都会触发新的计时:

1. 实现两次独立的并行延迟(同时开始,4秒后同时结束)

// 用函数包裹Promise创建逻辑
const wait4Seconds = () => new Promise((resolve) => {
  console.log("开始新的计时");
  setTimeout(() => resolve(), 4000);
});

// 两次调用会创建两个独立的Promise,同时开始计时
wait4Seconds().then(() => console.log("第一次完成"));
wait4Seconds().then(() => console.log("第二次完成"));

2. 实现顺序的两次延迟(先等4秒,再等4秒,总共8秒)

如果你的预期是先等4秒,完成后再等4秒,那可以用Promise链式调用:

const wait4Seconds = () => new Promise((resolve) => {
  setTimeout(() => resolve(), 4000);
});

// 链式调用,第一次完成后再触发第二次
wait4Seconds()
  .then(() => {
    console.log("第一次4秒延迟结束");
    return wait4Seconds(); // 返回新的Promise继续链式
  })
  .then(() => {
    console.log("第二次4秒延迟结束");
  });

关于缩进的小建议

你提到的制表符未生效的问题,大概率是编辑器的设置问题:

  • 检查编辑器的「Tab Size」设置,确保和项目要求的缩进大小一致(比如2或4)
  • 有些编辑器默认会把制表符自动转换成空格,如果想保留制表符,需要关闭「Convert Tabs to Spaces」选项
  • 个人建议用空格缩进,跨编辑器/环境的兼容性会更好,不容易出现缩进错乱的情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:15:19