Как работает 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 часто говорят о генераторах.