javascript - 如何在 react-saga 中协调这种行为?

标签 javascript redux-saga

我正在保存一个实体。

我想触发一个同步的 savePending(针对存储触发一个 reducer),然后是一个异步的 save 操作(进行网络调用以进行保存)。

function * saveEntity({ paylpoad: { id, name } }) {
  yield put (savePending()); // triggers a synchronous reducer
  yield put (save()); // triggers an async saga
  yield put (saveComplete());
}

在继续save 之前,redux-saga 是否会等待savePending 完成(即reducer 完成对store 的运行)? (大概是的)。

redux-saga 是否会等待与 put(例如 save)发出的 Action 关联的所有 reducer 和 sagas,即使它们是异步,在进入下一个 yield 之前(例如 saveComplete)?

最佳答案

是的,如您所料,savePending() reducer 将在 put (savePending()) 效果产生后立即运行。

另一方面,不,yield put (save()) 调用不会等待保存完成。

我想你有这样的代码:

const save = () => { type: SAVE_ACTION };

function * watchSave() {
  yield takeEvery(SAVE_ACTION, doSave);
}

function * doSave() {
    // [async saving logic]
}

当您放弃 save 操作时,它会触发对您的 reducer 的调用(如果您的保存操作仅用于触发 saga,它可能什么都不做),但是没有办法您的 saveEntity saga 需要等待 saveSaga,这是由 save 操作触发的。

有几种方法可以解决这个问题。一种是像这样编写代码:

function * saveEntity({ paylpoad: { id, name } }) {
  yield put (savePending());
  yield call (doSave());
  yield put (saveComplete());
}

通过直接调用 saveSaga()saveEntity 将等待 saveSaga() 完成,然后再继续。


另一方面,如果你想保持 saveEntitysaveSaga 的耦合度较低,你可以让 saveSaga 发出一个 Action saveEntity 可以监听:

function * watchSave() { /* as before */ }

function * doSave() {
  // [async saving logic]
  yield put(saveCompleted()); // Indicate that the save is completed
}

function * saveEntity({ paylpoad: { id, name } }) {
  yield put (savePending());
  yield put (save());
  // Wait for the saveSaga to be done:
  yield take (saveComplete());
}

关于javascript - 如何在 react-saga 中协调这种行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47515559/

相关文章:

javascript - 将值传递到 Redux Saga 中的 `next` 函数

javascript - 如何在我的无节点js环境中设置babel-standalone?

javascript - 将 backbone.js View 附加到现有元素与将 el 插入 DOM

JavaScript ".call"不明白

javascript - redux saga 和 history.push

redux - 如何将参数从 sagaMiddleware 传递到 Action 观察器

java - 寻找圆周率的展开

javascript - JS动态获取ID

reactjs - React-Redux 连接 : Use mapStatetoProps to inject only component part of store

javascript - 在 Typescript 中向创建的 Redux Store 添加属性