根据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()
传奇会导致foo
,bar
和baz
被打印。
实际上是什么影响? all([...effects])
函数的参数是什么类型的数组?
答案 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
,实际上可以看到它的通用版本可以使用任何类型的参数,而不仅仅是效果。)