如何从外部调用 saga sagas.js?

How to call saga from external sagas.js?

我在 containers/App/sagas.js 中有一个 sagas.js,其中包含一个登录传奇,我试图从一个登录弹出窗口中调用它,它也有自己的 sagas.js (components/LoginPopup/sagas.js) 并将以下解决方案捆绑在一起:

// containers/App/saga.js:

export const LOGIN = 'FUNAPP/App/LOGIN';

export const requestLogin = (payload: Object) => ({
  type: LOGIN + REQUESTED,
  payload,
});


export function* LoginRequest(payload) {
  window.alert("LOGIN REQUEST ");
  window.alert(payload)
}

export default function*(): Saga<void> {
  yield [
    takeLatest(LOGIN + REQUESTED, LoginRequest)
  ];
}

// components/LoginPopup/saga.js:

import { requestLogin, LoginRequest, LOGIN } from '../../containers/App/sagas';
export default function* (): Saga<void> {
    yield [
        takeLatest(LOGIN + REQUESTED, LoginRequest)
    ]
}

// components/LoginPopup/index.js
import { requestLogin } from '../../containers/App/sagas'

const mapStateToProps = state => ({
});

const mapDispatchToProps = dispatch => ({
    requestLogin: (payload) => dispatch(requestLogin(payload))
});

export default compose(
    injectSagas({ key: 'app', saga, reducer }),
    connect(mapStateToProps, mapDispatchToProps)
)(LoginPopup);

这感觉像是一种肮脏的做事方式,我希望我需要做的就是导入 requestLogin 函数,一切都会正常工作,或者至少比导出所有相关的更干净在那里发挥 LoginPopup 传奇的作用。

据我了解,您可能正在寻找以下内容:

// components/LoginPopup/saga.js:

import { all, call } from 'redux-saga/effects'
import loginRquest from '../../containers/App/sagas';

export default function* (): Saga<void> {
    yield all([
       call(loginRquest),
    ])
}

window.loginRquest = require('../../containers/App/sagas');

然后您可以在控制台中将 loginRquest 作为全局 javascript(vanilla js) 变量访问。

function* sagaOne() {
}

function* sagaTwo(action) {
  yield call(sagaOne); 
}

这个将从 sagaTwo 调用 sagaOne。唯一的问题是:你想用它做什么?如果你想将它与 redux 操作连接起来,或者让它可以从其他传奇或其他任何东西中调用。从技术上讲,您可以使用 takeLatest 数组从相同的操作类型启动两个传奇。如果你想在一个传奇中产生另一个传奇,上面的解决方案是可行的方法。