Как передать args из sagaMiddleware в action watcher - PullRequest
0 голосов
/ 22 сентября 2018

Я новичок в Sagas, использую, чтобы исходить из преувеличенного фона, поэтому я не уверен, как лучше всего передать аргументы моему окончательному действию.Я буду признателен за что-то вроде «За фиктивный ответ»

Дело в том, что у меня есть некоторый объект с именем session в моем магазине. Я создаю этот сеанс в sagaMiddleware, но для того, чтобычтобы мои функции в саге работали, мне всегда нужно взаимодействовать с этим объектом.

Итак, вопрос в том.Используя мой текущий код, как можно передать некоторые args (в данном случае «сеанс» к последнему действию в sagas.js)

store.js здесьэто "сессия"

sagaMiddleware.run(function* () {
    yield* saga1(session);
    yield* saga2(session);
  });

saga1.js

Действия экспорта:

export default function* root() {
  yield [
    fork(watchAction1),
    fork(watchAction2),
  ];
}

Наблюдатель действий

function* watchMyAction() {
  yield takeEvery(actionTypes.SEND_EVENT, myAction);
}

Действие

function* myAction(action) { // Here I want again the sesssion
  // Action.payload stuff, here I want my session arg from loadStore.js
}

1 Ответ

0 голосов
/ 22 сентября 2018

Есть несколько способов сделать то, что вы хотите, и выбор одного зависит как от вашего варианта использования, так и от предпочтений.

Способ передачи его вниз

Самый простой способпросто передать объект до саги myAction.

yield* saga1(session)
...
fork(watchAction1, session)
...
yield takeEvery(actionTypes.SEND_EVENT, myAction, session)
...
function* myAction(session, action) {
    console.log(session);
}

Это достаточно хорошее решение, если у вас всего несколько саг или если структура саг плоская, поэтому вы ненужно передать его слишком глубоко.

Метод импорта

Другой способ сделать это - импортировать объект сеанса.Если вам сначала нужно выполнить некоторую инициализацию, вы можете создать файл, который экспортирует одноэлементный объект, например так:

// session.js
import Session from 'session-library';

const config = {foo: 'bar'};
export default new Session(config);

Теперь вы можете импортировать этот файл туда, где вам нужен доступ к вашему сеансу.Вам не нужно пропускать его через несколько файлов / саг, просто чтобы передать его одной из ваших саг в глубине души.Тем не менее, это может быть немного более проблематичным, если вам нужно заменить объект сеанса.

// action.js
import session from 'path/to/session';

function* myAction(action) {
    console.log(session);
}

Метод контекста

Третий метод заключается в использовании setContext/getContext эффектов.Это мой личный фаворит, так как он не использует модульную систему, не требует специальных файлов, и вы можете запросить доступ к объектам, таким как session, именно в тот момент, когда вам это нужно, даже в середине саги.

// store.js
const stuffYouWantToAccess = {session};
sagaMiddleware.run(function* (stuffYouWantToAccess) {
    yield setContext(stuffYouWantToAccess);
   ...
}, stuffYouWantToAccess);

// action.js

function* myAction(action) {
    const session = yield getContext('session');
    console.log(session);
}

Это также не идеально, хотя контекст работает немного как глобальные переменные, и вам необходимо получить доступ к значениям контекста, используя строковые имена ('session'), что иногда может быть проблемой (например, при использовании закрытиякомпилятор или проверка типов).

Так что выбирайте свой яд:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...