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

如何在Effector的pending方法中获取effect的参数?

如何在Effector的pending方法中获取effect的参数?

嘿,这个问题我之前也纠结过!Effector的pending事件确实只返回一个布尔值,不会携带调用时的参数,但咱们换个思路就能解决——利用effect的started事件,它可是会把调用时的payload完整传过来的。

下面给你两种实用的实现方式:

方法一:扩展Store状态,结合started/done/fail事件

这种方式最直观,我们给Store增加两个字段:一个标记请求是否处于pending状态,另一个用来存储当前请求的参数。

首先修改Store的初始状态:

const usersStore = createStore({
  users: [],
  isPending: false,
  currentRequestParams: null // 用来存请求参数
});

然后监听effect的started事件,在这里设置pending状态为true,同时保存传入的参数:

// 当请求开始时,记录参数并标记pending
usersStore.on(getUsersEffect.started, (state, payload) => ({
  ...state,
  isPending: true,
  currentRequestParams: payload // 这里就能拿到{MY_CUSTOM_KEY: 10}啦
}));

最后监听done和fail事件,在请求结束后重置状态:

// 请求结束(成功/失败)后,重置pending和参数
usersStore.on([getUsersEffect.done, getUsersEffect.fail], (state) => ({
  ...state,
  isPending: false,
  currentRequestParams: null
}));

这样你就能在Store的状态里随时拿到当前pending请求的参数了,完全符合你的需求。

方法二:自定义事件传递参数(适合复杂场景)

如果你的业务场景需要更灵活的参数处理,可以自定义一个事件,在调用effect时同时触发这个事件传递参数:

// 自定义一个事件,用来传递请求参数
const userRequestStarted = createEvent();

// 监听这个事件,在Store里保存参数
usersStore.on(userRequestStarted, (state, params) => ({
  ...state,
  currentRequestParams: params
}));

// 结合pending事件管理状态
usersStore.on(getUsersEffect.pending, (state, isPending) => ({
  ...state,
  isPending
}));

// 调用effect时,同时触发自定义事件
const fetchUsers = (params) => {
  userRequestStarted(params);
  getUsersEffect(params);
};

// 调用的时候用这个封装后的方法
fetchUsers({MY_CUSTOM_KEY: 10});

这种方式把参数传递和pending状态管理分开,适合需要对参数做额外处理的场景。

总结一下,核心就是**pending事件本身不携带参数,但started事件会完整传递调用payload**,利用这一点就能轻松实现需求啦!

备注:内容来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 07:13:11