redux-saga - 在 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])
函数的参数?
解决方案
redux-saga 中的 Effect 是一个描述副作用的简单对象。这个想法是,不是直接执行“效果”(可以是常规函数调用,或者 a put
,或者 aselect
等),而是生成一个描述操作的 Effect 对象给 redux-saga,然后库决定做什么使用它(在 的情况下call
,它只会执行您的功能)。这样做的理由是假设它使测试更容易,因为您可以将 saga 作为普通生成器运行,并且只需比较生成的对象,而无需模拟任何东西。
事实上,Effects、Promises 和 generator 在 redux-saga 中大部分是可互换的,这只是该库的一个便利特性。Promise 和 generator 本身并不是 Effects,但它们在 redux-saga 代码中经常使用,作者认为支持它们作为一等公民是有益的。例如,yield
ing 一个 Promise 将阻塞直到 Promise 解决,并且yield call
在一个返回 Promise 的函数上做同样的事情。但是,这与效果无关,因此这里的文档有点误导。(如果您查看的 TypeScript 定义all
,您会发现它实际上有一个通用版本,它接受任何类型的参数,而不仅仅是 Effects。)
推荐阅读
- powershell - PowerShell Invoke-Command 连接错误
- python - 冒泡排序算法中的循环究竟是如何工作的?(Python 3)
- python - Dialogflow v2 api 在 Python 中的身份验证失败
- python - Trying to copy files with a specific extension from source folder to destination folder
- node.js - socket.io 连接在生产中失败,在 localhost 中工作
- javascript - Uncaught TypeError: this.getView is not a function inside the onPress event in meassage box in sap UI5
- vb.net - DateTime 格式和 ToString 格式
- pouchdb - 从客户端删除 PouchDB 文档而不清除浏览器
- reactjs - 在 React 中更改受控输入的值
- json - 如何通过 sed 命令将单行 json 转换为多行