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

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();

运行机制详解

  1. 调用print()后进入async函数,遇到await delay(2000),立刻暂停print的执行,把控制权交回主线程。
  2. delay函数创建一个Promise,同时启动2秒定时器,定时器回调会在2秒后加入事件队列。
  3. 主线程无其他任务,等待2秒后,定时器回调执行:先输出"Inside settimeout",接着调用resolve()——此时Promise状态从「挂起」变为「完成」。
  4. Promise完成后,await的等待结束,print函数恢复执行,输出"Outside settimeout"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:35:21