Await、Promise与setTimeout执行异常:main函数为何提前结束?
问题原因解析
为什么总耗时是4秒而非6秒?
Promise的构造函数会在创建时立即执行内部代码,不是等到await的时候才启动。你的代码里,promise1和promise2在main函数调用前就已经创建完成,它们的setTimeout同时开始计时:
promise2的定时器2秒后触发,输出promise2并resolvepromise1的定时器4秒后触发,输出promise1并resolve
当main里执行await promise1时,需要等4秒直到promise1resolve;此时promise2早就已经完成resolve,所以后续的await promise2会直接拿到结果,不需要额外等待。总耗时就是promise1的4秒,不是4+2=6秒。
为什么输出顺序是promise2、promise1?
两个定时器是同时启动的,2秒的定时器先到期,所以promise2的console.log先执行,4秒后promise1的console.log才执行——await只是等待Promise的最终结果,不会改变Promise内部代码的执行时机。
正确使用await的场景方案
场景1:需要顺序执行(先完成promise1,再启动promise2)
如果想要先等promise1执行完再启动promise2,把Promise的创建逻辑封装成函数,在await时才调用执行:
function createPromise1() { return new Promise((resolve, reject) => { setTimeout(() => { console.log("promise1"); resolve("promise1"); }, 4000); }); } function createPromise2() { return new Promise((resolve, reject) => { setTimeout(() => { console.log("promise2"); resolve("promise2"); }, 2000); }); } async function main() { const result1 = await createPromise1(); // 先启动并等待4秒完成 const result2 = await createPromise2(); // 再启动并等待2秒完成 console.log("end"); // 总耗时6秒,输出顺序:promise1 -> promise2 -> end } main();
场景2:需要并行执行但按顺序获取结果
如果希望两个Promise同时启动(节省时间),但按顺序拿到它们的结果,用Promise.all:
const promise1 = new Promise((resolve, reject) => { setTimeout(() => { console.log("promise1"); resolve("promise1"); }, 4000); }); const promise2 = new Promise((resolve, reject) => { setTimeout(() => { console.log("promise2"); resolve("promise2"); }, 2000); }); async function main() { const [result1, result2] = await Promise.all([promise1, promise2]); console.log("end"); // 总耗时4秒,输出顺序:promise2 -> promise1 -> end,result1对应promise1的结果、result2对应promise2的结果 } main();
内容的提问来源于stack exchange,提问作者Aminarune
相关产品推荐
相关产品推荐

