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

Redux Sagas 中 call 方法未调用传入函数问题求助

问题原因
  • 错误使用了yield*而非yield处理call返回的effect对象:call是Redux Saga提供的效应创建函数,执行后仅生成一个包含执行信息的普通描述对象,并不会直接执行目标函数,必须通过yield把该对象交给Saga中间件处理,才会实际触发createErrorReport调用并获取返回值。
  • yield*是ECMAScript原生的Generator委托语法,仅用于遍历另一个Generator实例的迭代内容,不会触发Saga中间件的效应处理逻辑,因此目标函数不会被执行。
解决方案

直接将yield*替换为yield即可,即使createErrorReport是返回普通对象的同步函数,Saga中间件也会正常执行它,并将返回值赋值给左侧变量:

function* createTrip(){
  try{ /* 原有业务逻辑 */ }
  catch(error) {
    const response = yield call(createErrorReport, Errors.FailedToCreateTrip, { error })
    // 后续可正常使用response的返回字段
  }
}

如果不需要对这段逻辑做单测模拟,也可以直接调用createErrorReport拿返回值,和普通同步函数调用完全一致,不需要使用call包裹:

const response = createErrorReport(Errors.FailedToCreateTrip, { error })

用call的优势是可以在不mockcreateErrorReport的前提下,直接对Saga生成的effect做单测断言,更便于测试维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:09:00