13

我正在使用redux-saga. 在代码yield* ReduxSaga.takeEvery('MY_ACTION', updatePorts);中,我如何访问action以获取其字段。

例如,我有一个动作创建者:

function status(){
  type: 'MY_ACTION',
  status: true
} 

如何action.status从我的传奇访问?还是我只能通过getState()select访问数据?

4

3 回答 3

35
const actionCreator=()=>({
  type: 'MY_ACTION',
  status:true
})

 function* updatePorts(action) {
  console.log(action.status)
}

function* watchUpdatePorts() {
  yield* takeEvery('MY_ACTION', updatePorts)
}

https://github.com/redux-saga/redux-saga/tree/master/docs/api#takeeverypattern-saga-args

于 2016-07-27T06:50:57.373 回答
2
const actionCreator = () => ({
  type: 'MY_ACTION',
  status: true
})

function* updatePorts() {
  while (true) {
      const { status } = take('MY_ACTION');
      // ...
  }

}

你也可以做这样的事情。redux-saga 文档对优点有很好的解释:

使用 take 会对我们编写代码的方式产生微妙的影响。在 takeEvery 的情况下,被调用的任务无法控制它们何时被调用。它们将在每个匹配的操作上一次又一次地被调用。他们也无法控制何时停止观察。

在采取的情况下,控制被反转。Saga 不是将操作推送到处理程序任务,而是自行拉动操作。看起来 Saga 正在执行一个正常的函数调用 action = getNextAction() ,它将在调度操作时解决。

在这里阅读更多:https ://redux-saga.js.org/docs/advanced/FutureActions.html

于 2017-09-03T22:14:45.643 回答
0

通常你可能有一个 root saga 或 index saga,你可以有一个带有 yield all 的 init 生成器,如下所示:

//in your action creator
const actionCreator = () => ({
    type: 'MY_ACTION1',
    status: true
});
//in your saga file, you will receive 'action' and then you can destructure it to status if you want.
function* updateDataForAction1({ status }) {
    //use value of status 
}
//in your root saga file
export function* watchInit() {
    yield all([
        takeEvery('MY_ACTION1', updateDataForAction1),
        takeEvery('MY_ACTION2', updateDataForAction2),
        takeEvery('MY_ACTION3', updateDataForAction3),
    ]);
}
于 2018-03-29T20:53:49.317 回答