Как позвонить в сагу с внешнего сайта sagas.js? - PullRequest
0 голосов
/ 27 мая 2018

У меня есть sagas.js в containers/App/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 там.

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

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

Затем вы можете получить доступ к loginRquest как глобальной переменной javascript (vanilla js) в консоли.

0 голосов
/ 07 июня 2018
function* sagaOne() {
}

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

Этот вызов будет называться sagaOne от sagaTwo.Единственный вопрос: что вы хотите с этим делать?Если вы хотите связать его с редукционными действиями или сделать так, чтобы его вызывали из других саг или чего-то еще.Технически вы можете запустить обе саги одного и того же типа действия с помощью массива takeLatest.Если вы хотите получить результат в одной саге в другой, то вышеприведенное решение - это то, что вам нужно.

0 голосов
/ 31 мая 2018

Насколько я понимаю, это то, что вы можете искать:

// 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),
    ])
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...