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
相关产品推荐
相关产品推荐

