【问题标题】:How to get the result of a Saga?如何获得 Saga 的结果?
【发布时间】:2018-08-23 10:41:43
【问题描述】:

假设我有一个带有按钮的模式,如果你点击它,它就会调度一个动作。我想知道发送的动作的结果:例如如果它成功了,我将关闭模态并关闭其他方式。 使用 redux-thunk 我的操作看起来像:

export const deleteObjects = () => {
  return (dispatch, getState) => {
    try {
      ...
      dispatch(setObjects([]));
      return true
    } catch (e) {
      return false
    }
  }
};

所以我可以在我的组件中使用结果。但是如何对 redux-sagas 做同样的事情呢?据我所知,您可以将 sagas 与观察者一起使用。 我能想到的一种解决方案是将回调函数传递给动作创建者并在 saga 内部调用它。像这样:

export const deleteObjects = (callback) => ({
  type: DELETE_OBJECTS,
  callback
});

export function* deleteObjectsAsync({callback}) {
  try {
    ...
    put(setObjects([]))
    yield call(callback, true)
  } catch (err) {
    yield call(callback, false)
  }
}


function* watchGetPlaces() {
  yield takeEvery(DELETE_OBJECTS, deleteObjectsAsync)
}

这是一个有效的解决方案还是有更合适的方法?

【问题讨论】:

  • 我想我不明白。如果您的模态受到外部状态的影响,例如标志 isOpen,那么当结果影响减速器时,您的 isOpen 将变为 false。模态将关闭。我是否符合您的需求?
  • @jstuartmilne 不完全是,问题不在于关闭模式,而在于调度操作的结果。我想从中获得一些反馈(就像在带有 thunk 的示例中一样)

标签: redux react-redux redux-saga


【解决方案1】:

我不推荐您提出的解决方案。传递回调函数是 redux-saga 试图阻止开发人员必须处理的精确事情之一。

一个干净的解决方案是将您的模态关闭功能包装到它自己的 saga 中,该 saga 可以由操作调用。我不确定您是如何打开模态的,但在我们的应用程序中,我们会发送动作来打开和关闭模态。这样做可以使连接的组件 sagas 可以操纵任何模式。 Sagas 旨在处理副作用。关闭模式是一个副作用。因此,saga 是放置关闭模态逻辑的理想场所。

看看这个样板:

export const closeModal = () => ({
  type: CLOSE_MODAL,
});
function* onCloseModal() {
  // Your logic for closing modals goes here
}
function* closeModalSaga() {
  yield takeEvery(CLOSE_MODAL, onCloseModal)
}

export const deleteObjects = () => ({
  type: DELETE_OBJECTS,
});
export function* deleteObjectsAsync() {
  try {
    ...
    yield put(setObjects([]))
    yield put(closeModal());
  } catch (err) {
    // Your "do-something-else" logic here
    // I'd recommend dispatching another action
  }
}
function* watchGetPlaces() {
  yield takeEvery(DELETE_OBJECTS, deleteObjectsAsync)
}

【讨论】:

  • 用 react-router 来改变路由怎么样?这也会进入传奇故事吗?
  • 当然。改变路线是一个副作用。您可以在 saga 中调用 browserHistory.push(route)。一个简单的测试方法是calling。即yield call(browserHistory.push, route); (import { browserHistory } from 'react-router';)
  • 你使用类似react-router-redux / connected-react-router 的东西吗?
猜你喜欢
  • 2012-04-02
  • 2014-04-25
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多