redux-saga:从另一个文件调用saga

时间:2018-07-05 06:23:03

标签: reactjs redux-saga

我有几个传奇文件。 一用于导航,一用于编辑。 所以我想在我的编辑传奇中 “ SAVE_USER” 经过一些操作后,从导航传奇文件“ GO_TO_ROOT”插入传奇 等待直到完成,然后继续其余的“ SAVE_USER”吗?

editing-saga.js

export function* sagaUser(action) {
  try {
    console.log("preparing user")
    console.log("saving user")
     yield put({
      type: "GO_TO_ROOT",
      payload: { true }
    });
    console.log("user saved")
  } catch (e) {
  }
}

navigation-saga.js

export function* goToRoot(action) {
  try {
    console.log("preparing going to root")
    yield call(goToRoot);
    console.log("go to root success")
  } catch (e) {
  }
}

2 个答案:

答案 0 :(得分:0)

可以在另一个传奇中调用yield。例如:

import { goToRoot } from './navigation-saga.js'

export function* sagaUser(action) {
  try {
    console.log("preparing user")
    console.log("saving user")

    yield goToRoot({
      type: "GO_TO_ROOT",
      payload: { true },
    });

    console.log("user saved")
  } catch (e) { }
}

希望这会有所帮助。

答案 1 :(得分:0)

使用sagas的一个明显好处是,您可以更好地分离关注点。但是最终您会在sagas之间传递更多的消息(操作)。您的问题的一种解决方案是,根传奇调度一个动作(GO_TO_ROOT_SUCCESS),该动作可以由edit-aga侦听。像-

动作

const gotoSuccess = {
  type: "GO_TO_SUCCESS",
};

navigation-saga.js

export function* goToRoot(action) {
  try {
     // some logic
     yield put(gotoSuccess);
  } catch (e) {
  }
}

editing-saga.js

export function* sagaUser(action) {
  try {
     yield put({
      type: "GO_TO_ROOT",
      payload: { true }
    });

     yield take("GO_TO_SUCCESS");

    // some more logic
  } catch (e) {
  }
}