JavaScript中await语句后程序未执行后续代码直接终止问题咨询
问题原因与解决方法
你的代码核心问题是delay函数返回的Promise从未被resolve,导致await一直处于等待状态,后续代码永远不会执行。
问题分析
当执行await delay(2000)时,JavaScript会暂停print函数的执行,等待delay返回的Promise进入「完成」或「失败」状态。但你创建的Promise只初始化了,却没有调用resolve()来标记它完成——这个Promise会一直处于「挂起」状态,await就永远不会放行,console.log("Outside settimeout")自然不会执行。
而setTimeout是独立的定时器任务,到时间就会执行回调输出"Inside settimeout",但这和Promise的状态完全无关,所以程序只会输出这句话,随后因为没有活跃的异步任务可处理,直接终止。
修复后的代码
只需要在setTimeout的回调里调用Promise的resolve方法,让Promise完成:
function delay(sec) { return new Promise((resolve)=>{ setTimeout(()=>{ console.log("Inside settimeout"); resolve(); // 标记Promise完成,让await继续执行后续代码 },sec); }) } async function print() { await delay(2000); console.log("Outside settimeout"); } print();
运行机制详解
- 调用
print()后进入async函数,遇到await delay(2000),立刻暂停print的执行,把控制权交回主线程。 delay函数创建一个Promise,同时启动2秒定时器,定时器回调会在2秒后加入事件队列。- 主线程无其他任务,等待2秒后,定时器回调执行:先输出"Inside settimeout",接着调用
resolve()——此时Promise状态从「挂起」变为「完成」。 - Promise完成后,
await的等待结束,print函数恢复执行,输出"Outside settimeout"。
内容的提问来源于stack exchange,提问作者tdcoder
相关产品推荐
相关产品推荐

