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

异步函数修改数组后,JSON传递属性未获取正确值的问题

异步函数未等待完成导致数组值未更新的问题解决

你的问题其实是异步代码执行顺序的典型坑——你调用了异步函数但没等它做完就急着发送响应了!

让我拆解一下:

  • setDefinitions是个async函数,里面的await DefinitionGetter.setDefinition(...)会暂停函数执行,直到获取定义的异步操作完成,然后才会给数组赋值并打印日志。这就是为什么控制台能输出正确值的原因——日志是等异步操作结束后才打的。
  • 但在sendHorizontalWordsHints里,你直接调用this.newGrid.setDefinitions();之后立刻就执行res.send(...)了,这时候异步操作还在后台跑,数组horizontalWordsHints根本还没被赋值,所以发送出去的自然是旧值或者初始值。

解决方法有两种,选哪种都可以:

方法1:把sendHorizontalWordsHints改成异步函数,用await等待操作完成

public async sendHorizontalWordsHints(req: Request, res: Response, next: NextFunction): Promise<void> {
    // 等异步获取定义的操作彻底完成
    await this.newGrid.setDefinitions();
    // 现在数组已经被正确赋值了,再发送
    res.send(JSON.stringify(this.newGrid.horizontalWordsHints));
}

方法2:用then()链式调用处理Promise

如果不想修改函数的返回类型,也可以用Promise的链式调用:

public sendHorizontalWordsHints(req: Request, res: Response, next: NextFunction): void {
    this.newGrid.setDefinitions()
        .then(() => {
            // 异步完成后再发送响应
            res.send(JSON.stringify(this.newGrid.horizontalWordsHints));
        })
        .catch(error => {
            // 别忘了处理异步过程中可能出现的错误,比如获取定义失败的情况
            next(error);
        });
}

核心要点就是:async函数会返回一个Promise,你必须通过await或者then()来等待它执行完毕,否则后续代码会跳过异步操作直接执行,自然拿不到正确的结果。

内容的提问来源于stack exchange,提问作者Mohamed-Ali Elakhrass

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:10:47