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

TypeScript中await异步父类方法未执行后续代码问题解析

异步方法调用未等待完成导致输出不全的问题分析

定义的类代码

class X {
    constructor() {
    }

    public async doSomething(): Promise<string> {
        console.log('x')
        return 'x'
    }
}

class Y extends X {
    constructor() {
        super()
    }

    public override async doSomething(): Promise<string> {
        console.log('y before')
        await super.doSomething()
        console.log('y after')
        return 'y'
    }
}

执行代码

const y = new Y()
y.doSomething()

预期输出

y before
x
y after

实际输出

y before
x

问题原因

doSomething是异步方法,调用后会立即返回一个Promise,await super.doSomething()之后的console.log('y after')属于Promise的微任务回调逻辑,会被放到事件循环的微任务队列中等待执行。如果当前脚本执行完毕后没有其他同步代码,程序会直接终止,事件循环来不及处理微任务队列里的后续逻辑,导致y after无法打印。

当你添加后续代码时,同步代码的执行时间被拉长,事件循环有机会处理微任务队列,y after就会被正常打印。

解决办法

方法1:用await等待异步方法完成

把执行逻辑放到async函数中,通过await等待Promise执行完成:

async function execute() {
  const y = new Y()
  await y.doSomething()
}
execute()

方法2:通过then()绑定回调

给返回的Promise添加then回调,确保后续逻辑被触发:

const y = new Y()
y.doSomething().then(() => {
  // 可处理返回结果,也可留空,核心是让Promise的后续逻辑执行
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:43:20