javascript - 如何重构 redux-saga 生成器函数?

标签 javascript redux react-redux generator redux-saga

我是 redux-saga 和生成器函数的新手。

正如您从我的 sagas.js 代码中看到的,存在重复的逻辑:

import { put, takeEvery, takeLatest, all, call } from 'redux-saga/effects';
import { setRandomColour, SET_RANDOM_COLOUR_DELAYED } from './actions';

const delay = (ms) => new Promise(res => setTimeout(res, ms));

export function* setRandomColourGeneratorLatest({ payload: { id, ms, sagaType } = {}} = {}){
  if(sagaType !== 'takeLatest') return;
  console.log("set random colour", id, ms);
  yield call(delay, ms);
  yield put(setRandomColour(id));
}
export function* setRandomColourGeneratorEvery({ payload: { id, ms, sagaType } = {}} = {}){
  if(sagaType !== 'takeEvery') return;
  console.log("set random colour", id, ms);
  yield call(delay, ms);
  yield put(setRandomColour(id));
}

export function* watchSetRandomColourLatest(){
  yield takeLatest(SET_RANDOM_COLOUR_DELAYED, setRandomColourGeneratorLatest)
}
export function* watchSetRandomColourEvery(){
  yield takeEvery(SET_RANDOM_COLOUR_DELAYED, setRandomColourGeneratorEvery)
}

export default function* rootSaga(){
  yield all([
    watchSetRandomColourLatest(),
    watchSetRandomColourEvery()
  ])
}

所以我尝试通过放置yield调用来重构它,并将yield放入单个生成器函数中,然后在setRandomColourGeneratorLatest/Every中调用它,但无论如何,我无法让代码保持正常运行。我相信这是因为产量将取决于生成器函数的先前调用,而在这种情况下,需要有 2 个单独版本的生成器函数。

如何重构此代码以减少重复逻辑,同时分离 takeEvery 和 takeLatest 版本的产量?

最佳答案

您正在寻找这样的东西吗?你的代码中确实没有那么多重复...老实说,我会保留它的原样,因为 setRandomColourGeneratorLatest 和 setRandomColourGeneratorEvery 之间的通用代码在某些时候需要不同的可能性可能很高,那么你将不得不取消干燥你的代码。

import { put, takeEvery, takeLatest, all, call } from 'redux-saga/effects';
import { setRandomColour, SET_RANDOM_COLOUR_DELAYED } from './actions';

const delay = (ms) => new Promise(res => setTimeout(res, ms));

export function* setRandomColourGeneratorLatest({ payload: { id, ms, sagaType } = {}} = {}){
  if(sagaType !== 'takeLatest') return;
  console.log("set random colour", id, ms);
  yield call(setRandomColor, ms, id);
}
export function* setRandomColourGeneratorEvery({ payload: { id, ms, sagaType } = {}} = {}){
  if(sagaType !== 'takeEvery') return;
  console.log("set random colour", id, ms);
  yield call(setRandomColor, ms, id);
}

export function* setRandomColor(ms, id){
  yield call(delay, ms);
  yield put(setRandomColour(id));
}

export function* watchSetRandomColourLatest(){
  yield takeLatest(SET_RANDOM_COLOUR_DELAYED, setRandomColourGeneratorLatest)
}
export function* watchSetRandomColourEvery(){
  yield takeEvery(SET_RANDOM_COLOUR_DELAYED, setRandomColourGeneratorEvery)
}

export default function* rootSaga(){
  yield all([
    watchSetRandomColourLatest(),
    watchSetRandomColourEvery()
  ])
}

关于javascript - 如何重构 redux-saga 生成器函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55906527/

相关文章:

javascript将所有样式的元素复制到剪贴板

javascript - 如何等到 jQuery 函数完成后再继续?

reactjs - redux Reactjs 中的相对时间

javascript - 列出每个元素的修改按钮

redux - 调度 Action 或 reducer ?

javascript - 如何根据另一个选择中的选择设置一个选择中的文本

javascript - 路由更改后服务中的 AngularJS 函数抛出 'not a function error'?

reactjs - 将帮助文本传递给 redux-form

javascript - Redux store不随react状态的变化而变化

javascript - 在 React Context API 中共享类实例是否安全?