Что такое эффект в контексте Redux-Saga

czerny спросил: 12 мая 2018 в 04:23 в: redux-saga

В соответствии с документом

мы получаем простые объекты 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])?

1 ответ

Sasha Chedygov ответил: 05 июня 2018 в 02:31

Эффект в редукс-саге - простой объект, описывающий побочный эффект. Идея заключается в том, что вместо прямого выполнения "эффекта" (который может быть обычным вызовом функции или put или select и т. Д.), Вы получаете объект Effect, описывающий операция с редукцией-сагой, и библиотека решает, что с ней делать (что в случае call будет просто выполнять вашу функцию). Обоснованием для этого является то, что он гипотетически облегчает тестирование, потому что вы можете запускать сагу как обычный генератор и просто сравнивать полученные объекты, не придумывая ничего.

Тот факт, что эффекты, обещания и генераторы в основном взаимозаменяемы в redux-saga - это просто удобная функция библиотеки. Обещания и генераторы сами по себе не являются Эффектами, но они используются достаточно часто в коде с сокращенной сагой, что автор видел выгоду в поддержке их как первоклассных граждан. Например, yield с обещанием будет блокироваться до тех пор, пока обещание не будет устранено, и выполнение yield call функции, которая возвращает Promise, сделает то же самое. Это не имеет ничего общего с эффектами, поэтому документация здесь немного вводит в заблуждение. (Если вы посмотрите на определение TypeScript для all, вы увидите, что на самом деле есть его общая версия, которая принимает параметры любого типа, а не только эффекты.)