Что такое эффект в контексте Redux-Saga - PullRequest
0 голосов
/ 05 июня 2018

Согласно doc :

мы получаем простые 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 Ответ

0 голосов
/ 29 июня 2018

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

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

...