异步函数修改数组后,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
相关产品推荐
相关产品推荐

