添加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
相关产品推荐
相关产品推荐

