关于Async/Await中多Promise执行时序的疑问
Async/Await 处理多Promise的执行时序解析
核心前提:Promise的执行特性
当你通过new Promise((resolve, reject) => { ... })创建Promise时,传入的executor函数(即括号内的回调)会立即同步执行——不管函数内部包含的是同步逻辑还是异步操作(比如setTimeout),都会在Promise创建的瞬间启动。这是理解两段代码时序差异的关键。
第一段代码解析
代码示例
const p1 = new Promise((resolve, reject) => { setTimeout(() => { resolve("Promise Resolved Value!!"); }, 20000); }); const p2 = new Promise((resolve, reject) => { setTimeout(() => { resolve("Promise Resolved Value!!"); }, 10000); }); async function handlePromise() { try { console.log("Hello World!!"); const val = await p1; console.log("Namaste JavaScript"); console.log(val); const val2 = await p2; console.log("Namaste JavaScript 2"); console.log(val2); } catch (error) { console.error("Error:", error); } } handlePromise();
时序逻辑
- 程序启动后,
p1和p2立即被创建,它们内部的setTimeout同时开始计时:p1的定时器为20秒,p2为10秒。 - 调用
handlePromise(),先同步打印Hello World!!。 - 遇到
await p1:此时p1处于pending状态,函数暂停执行,等待p1resolve。 - 在等待
p1的20秒内,p2的定时器在第10秒就已经触发,p2变为resolved状态,但因为handlePromise还在等待p1,所以不会继续执行后续逻辑。 - 第20秒时,
p1resolve,函数恢复执行:打印Namaste JavaScript和p1的值;接着遇到await p2——此时p2早已是resolved状态,await不会暂停,直接获取p2的值,继续打印后续内容。 - 最终表现为:等待20秒后,
p1和p2的相关内容几乎同时输出。
第二段代码解析
代码示例
const p1 = new Promise((resolve, reject) => { setTimeout(() => { resolve("Promise Resolved Value!!"); }, 10000); }); const p2 = new Promise((resolve, reject) => { setTimeout(() => { resolve("Promise Resolved Value!!"); }, 20000); }); async function handlePromise() { try { console.log("Hello World!!"); const val = await p1; console.log("Namaste JavaScript"); console.log(val); const val2 = await p2; console.log("Namaste JavaScript 2"); console.log(val2); } catch (error) { console.error("Error:", error); } } handlePromise();
时序逻辑
- 程序启动后,
p1和p2立即被创建,内部的setTimeout同时开始计时:p1的定时器为10秒,p2为20秒。 - 调用
handlePromise(),先同步打印Hello World!!。 - 遇到
await p1:p1处于pending状态,函数暂停,等待p1resolve。 - 第10秒时,
p1resolve,函数恢复执行:打印Namaste JavaScript和p1的值;此时遇到await p2——p2的定时器已经运行了10秒,还剩10秒才会触发,因此函数再次暂停。 - 又过10秒(从程序启动算起第20秒),
p2resolve,函数恢复执行,打印p2的相关内容。 - 最终表现为:打印
Hello World!!后,等待10秒输出p1相关内容,再等待10秒输出p2相关内容(注:你描述的“等待20秒输出p1相关内容”应为笔误,实际是等待10秒)。
关键总结
- Promise创建时立即启动内部逻辑,而非等到
await时才开始执行。 await仅在目标Promise处于pending状态时会暂停函数;若目标Promise已为resolved状态,会直接获取结果并继续执行。
内容的提问来源于stack exchange,提问作者Redhawk18
相关产品推荐
相关产品推荐

