首页 > 解决方案 > 在 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

解决方案


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

事实上,Effects、Promises 和 generator 在 redux-saga 中大部分是可互换的,这只是该库的一个便利特性。Promise 和 generator 本身并不是 Effects,但它们在 redux-saga 代码中经常使用,作者认为支持它们作为一等公民是有益的。例如,yielding 一个 Promise 将阻塞直到 Promise 解决,并且yield call在一个返回 Promise 的函数上做同样的事情。但是,这与效果无关,因此这里的文档有点误导。(如果您查看的 TypeScript 定义all,您会发现它实际上有一个通用版本,它接受任何类型的参数,而不仅仅是 Effects。)


推荐阅读