如何捕获Redux-Saga`call`函数的yield值?

时间:2017-06-08 11:16:03

标签: javascript redux-saga

我有一个非常简单的函数返回一个对象:

export const fetchThing = (thingId) => ({
  description: "hi",
  thing: thingId
})

我稍后会扩展此功能以执行异步操作,但我试图让事情变得简单。

使用Redux-Saga我尝试执行以下操作:

export function* requestThingSaga({payload}) {
  const thing = yield call(fetchThing, payload.thingId)
  console.log(thing);
}

但是当我测试传奇时,我发现fetchThing没有被调用:

gen = requestThingSaga({payload: {thingId: 1 });
gen.next() // logs 'undefined'

我无法理解发生了什么。 call的文档表示可以使用具有正常返回值的函数。我不明白为什么这不起作用。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

redux-saga的重点是制作效果“声明性”。所以你需要一个能够处理这些效果的解释器。 ReduxSaga中间件充当了这样一个解释器,可以执行调用,等待承诺等。否则它只是一个声明(在这种情况下)你想调用外部函数。因此,你的测试有点“测试效果解释器”,只能断言你的传奇返回的效果,而不是实际做“真实”的事情。

gen = requestThingSaga({payload: {thingId: 1 });

// test by inspecting .value w/o actuall call
gen.next().value.should.be.deep.equal(call(fetchThing, 1))

// "interprete" call effect by passing a value back
gen.next({description: 'hi', thing: 1})

BTW gen应该更好地命名为iter :)因为它是Iterator而不是生成器。