Что возвращают вызовы API Redux-Saga?(возьмите, к примеру) - PullRequest
0 голосов
/ 23 ноября 2018

Я очень новичок в redux-saga и читаю документацию.Одна вещь, которую я не понимаю, это то, что, в частности, API вызывает return .

Когда я говорю «возврат», я полагаю, что спрашиваю о двух вещах

  • каково возвращаемое значение того, что в документации называется «фабричной функцией»?(то есть здесь https://redux -saga.js.org / docs / advanced / Testing.html документ гласит: «Поскольку саги всегда дают эффект, и эти эффекты имеют простые заводские функции (например,, возьмите и т. д.) ", что, вообще, будет возвращаемыми значениями этих фабричных функций?

  • каково возвращаемое значение этих" фабричных функций ", когда yield edв промежуточное программное обеспечение redux-saga?

Например, в документации (https://redux -saga.js.org / docs / advanced / Concurrency.html )у них есть

import {fork, take} from "redux-saga/effects"

const takeEvery = (pattern, saga, ...args) => fork(function*() {
  while (true) {
    const action = yield take(pattern)
    yield fork(saga, ...args.concat(action))
  }
})

Насколько я понимаю, здесь take, когда yield ed возвращает action, который соответствует шаблону. Таким образом, я принимаю это как всегда возвращаемое значение.Так что здесь (https://redux -saga.js.org / docs / advanced / NonBlockingCalls.html )

function* loginFlow() {
  while (true) {
    const {user, password} = yield take('LOGIN_REQUEST')
    const token = yield call(authorize, user, password)
    if (token) {
      yield call(Api.storeItem, {token})
      yield take('LOGOUT')
      yield call(Api.clearItem, 'token')
    }
  }
}

user и password являются полями в возвращаемом действии?

Но где это задокументировано, что take, когда yield ed возвращает действие? Я перешел к документации для take, и покаесть довольно хорошее описание того, что он делает, я не видел, что он возвращает.

В общем, есть ли какое-то базовое предположение о вызовах API и их возвращаемых значениях, которые я пропускаю из-за моего статуса новичка?Или - и это вполне вероятная возможность - я, возможно, просто упустил из виду, где упоминается возвращаемое значение.

Спасибо за любые идеи - и, если вам известна хорошая альтернатива, подробный обзор redux-sagaЯ бы приветствовал любые ссылки.Я просматривал учебные пособия и сообщения в блогах, но хотел бы, чтобы у меня был хороший и глубокий взгляд.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Как работает redux-saga

Хорошо, я думаю о том, как работает redux-saga.

Прежде всего, с redux-saga, вы пишете с использованием функций генератора ES6.Функция генератора работает как музыкальная шкатулка: когда вы поворачиваете ручку, она воспроизводит ноты одну за другой.Когда вы останавливаетесь, он останавливается.

В нашем случае, это время выполнения излишней саги, которое поворачивает ручку.Примечания - это эффекты, которые дает ваша сага.

Функции генератора, которые вы пишете, полностью пассивны.Они дают простые объекты, называемые эффектами .Вы можете напечатать эффект, чтобы увидеть, как он выглядит:

console.log(take('SOME_ACTION'))

Вы увидите, что это просто объект.Функция take() просто создает такой объект, у него нет побочных эффектов.Например, если вы забудете использовать yield, ничего не произойдет.

Как работает take ()

Предположим, вы получаете эффект take() из своей саги:

const action = yield take('SOME_ACTION')

Когда во время выполнения redux-saga ваша сага исполняется, он делает что-то вроде этого:

// It initializes the generator
let gen = yourSaga()

// And then it turns the handle,
// extracting effects that you yield, one by one
while (true) {
  // ...
  const effect = gen.next().value
  // Now redux-saga analyses your effect, and executes what you asked for
  // ...
}

Когда он в конечном итоге натыкается на ваш take() эффект, он останавливается и отключает генератор на потом.

Позже, когда среда выполнения redux-saga обнаруживает, что отправлено SOME_ACTION, он находит ваш генератор и продолжает его выполнять:

gen.next(action).value

Но на этот раз в программе redux-saga используется функция генератора, котораямузыкальная шкатулка не имеет.Среда выполнения Redux-saga предоставляет действие, обнаруженное с помощью функции next().То, что вы передаете next(), становится значением выражения yield ... внутри вашего генератора.

Я надеюсь, что это полезно, потому что документы на основе redux-saga часто говорят о генераторах.

0 голосов
/ 23 ноября 2018

только что заглянул в саги впервые.

, насколько я понимаю, take похож на слушателя.в вашем примере пользователь входит в систему, а затем taking первый LOGOUT, который произойдет.

в этом случае ожидание выхода из системы означает, что вы ожидаете, пока не будет отправлено действие LOGOUT.Таким образом, вы получите параметры, которые были отправлены при выходе из системы.

выход из системы, вероятно, отправляется следующим образом

put({type: 'LOGOUT', ...params})

params - это то, что вы получаете, когда слушаете LOGOUTиспользуя дубль.

...