如何从外部调用 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 数组从相同的操作类型启动两个传奇。如果你想在一个传奇中产生另一个传奇,上面的解决方案是可行的方法。
我在 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 数组从相同的操作类型启动两个传奇。如果你想在一个传奇中产生另一个传奇,上面的解决方案是可行的方法。