在Redux-Saga的背景下有什么影响

时间:2018-06-05 18:03:50

标签: redux-saga

根据doc

  

我们从Generator生成纯JavaScript对象。我们称之为对象效应。

它似乎是一个JavaScript对象,例如像这样:

// Effect -> call the function Api.fetch with `./products` as argument
{
  CALL: {
    fn: Api.fetch,
    args: ['./products']
  }
}

这似乎是effect creators之一的结果。

然而,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()传奇会导致foobarbaz被打印。

实际上是什么影响? all([...effects])函数的参数是什么类型的数组?

1 个答案:

答案 0 :(得分:1)

redux-saga中的Effect是描述side effect的简单对象。这个想法是,不是直接执行“效果”(可以是常规函数调用,或者是put,或者是select等),而是生成了一个Effect对象,描述了对redux的操作-saga,然后库决定如何处理(在call的情况下,它将仅执行您的函数)。这样做的理由是,它可以使测试更加容易,因为您可以将saga作为普通生成器运行,并且只需比较产生的对象,而无需模拟任何东西。

效果,承诺和生成器在redux-saga中大部分是可互换的,这只是该库的一项便利功能。 Promises和Generators本身并不是效应,但是在redux-saga代码中经常使用它们,因此作者看到了支持他们作为一等公民的好处。例如,yield进行Promise将会阻塞,直到Promise解决为止,对返回Promise的函数执行yield call也会这样做。但是,这与效果无关,因此此处的文档有点误导。 (如果您查看the TypeScript definition for all,实际上可以看到它的通用版本可以使用任何类型的参数,而不仅仅是效果。)