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

MobX async action执行后调用函数顺序错位,依赖computed值异常如何解决

问题原因

MobX 对 async/await 语法的异步 action 默认只会包裹 await 关键字之前的代码到 action 事务中,await 之后的状态修改代码默认在全局作用域执行,没有被 action 管理。这就导致你修改 furnitureMap 的操作和 Promise resolve 的时机不同步,finally 代码块执行时状态修改还未被 MobX 处理,getAllFurniture computed 值还是旧数据。

解决方案

方案1:用 runInAction 包裹 await 后的状态修改代码

手动将所有修改状态的逻辑放到 runInAction 中,确保状态修改同步完成后 Promise 才会 resolve,修改后的 store 代码如下:

import { runInAction } from "mobx"

loadFurniturePage = async (pageNumber: number, pageAmount: number) => {
  const nextPage = await agent.FrontEnd.getNextFurniturePage(pageNumber, pageAmount);
  runInAction(() => {
    nextPage.forEach((furniture: IFurniture) => {
      furniture.type = furniture.typeInString;
      this.furnitureMap.set(furniture.id, furniture)          
    });
  })
}

方案2:用 flow 定义异步 action(更推荐)

MobX 提供的 flow 工具基于 generator 函数实现,会自动把所有状态修改逻辑包裹到 action 中,不需要手动处理作用域问题,代码如下:

import { flow } from "mobx"

loadFurniturePage = flow(function* (pageNumber: number, pageAmount: number) {
  const nextPage = yield agent.FrontEnd.getNextFurniturePage(pageNumber, pageAmount);
  nextPage.forEach((furniture: IFurniture) => {
    furniture.type = furniture.typeInString;
    this.furnitureMap.set(furniture.id, furniture)          
  });
})

修改后 finally 代码块就会在所有状态修改完成后执行,onSortHandler 中拿到的 getAllFurniture 就是最新的计算值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:48:04