В соответствии с документом
мы получаем простые объекты JavaScript из генератора. Мы называем эти эффекты объектов.
кажется, что объект JavaScript выглядит, например. например:
// Effect -> call the function Api.fetch with `./products` as argument
{
CALL: {
fn: Api.fetch,
args: ['./products']
}
}
Кажется, это результат одного из создателей эффекта.
Однако документация к all([...effects])
выглядит как принятые параметры являются эффектами, и в то же время функция all()
принимает и обещания и генераторы.
import { all, call } from 'redux-saga/effects'const callEffect = call(console.log, 'foo')function* gen() {
console.log('bar')
}const promise = new Promise(resolve => {
console.log('baz')
resolve()
})function* print() {
yield all([ callEffect, gen(), promise])
}
Вызов print()
saga приведет к foo
, bar
и baz
.
Что на самом деле является эффектом? Массив какого типа является параметром функции all([...effects])
?
Эффект в редукс-саге - простой объект, описывающий побочный эффект. Идея заключается в том, что вместо прямого выполнения "эффекта" (который может быть обычным вызовом функции или
put
илиselect
и т. Д.), Вы получаете объект Effect, описывающий операция с редукцией-сагой, и библиотека решает, что с ней делать (что в случаеcall
будет просто выполнять вашу функцию). Обоснованием для этого является то, что он гипотетически облегчает тестирование, потому что вы можете запускать сагу как обычный генератор и просто сравнивать полученные объекты, не придумывая ничего.Тот факт, что эффекты, обещания и генераторы в основном взаимозаменяемы в redux-saga - это просто удобная функция библиотеки. Обещания и генераторы сами по себе не являются Эффектами, но они используются достаточно часто в коде с сокращенной сагой, что автор видел выгоду в поддержке их как первоклассных граждан. Например,
yield
с обещанием будет блокироваться до тех пор, пока обещание не будет устранено, и выполнениеyield call
функции, которая возвращает Promise, сделает то же самое. Это не имеет ничего общего с эффектами, поэтому документация здесь немного вводит в заблуждение. (Если вы посмотрите на определение TypeScript дляall
, вы увидите, что на самом деле есть его общая версия, которая принимает параметры любого типа, а не только эффекты.)