【问题标题】:What is effect in context of Redux-Saga在 Redux-Saga 的上下文中会产生什么影响
【发布时间】:2018-06-30 00:11:26
【问题描述】:

根据doc

我们从生成器中生成纯 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() saga 将导致打印foobarbaz

究竟什么是效果? all([...effects])函数的参数是什么类型的数组?

【问题讨论】:

  • 当谈到 redux-saga 中的效果时,您可以指效果对象或 redux-saga 协程可以处理的任何东西。虽然通常我认为人们会指的是前者。我认为“数组”的类型只能通过“作者决定支持的内容”来描述,这可以在 redux-saga api 参考中找到。如果您有兴趣更深入地了解编程中的效果,我建议您观看youtube.com/watch?v=z8SI7WBtlcA

标签: redux-saga


【解决方案1】:

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

Effects、Promises 和 generator 在 redux-saga 中大部分是可互换的,这只是该库的一个便利特性。 Promise 和 generator 本身并不是 Effects,但它们在 redux-saga 代码中的使用频率已经足够高,以至于作者看到了支持它们作为一等公民的好处。例如,yield 执行 Promise 将阻塞,直到 Promise 解决,并且在返回 Promise 的函数上执行 yield call 将执行相同的操作。但是,这与效果无关,因此这里的文档有点误导。 (如果您查看the TypeScript definition for all,您会发现它实际上有一个通用版本,它接受任何类型的参数,而不仅仅是效果。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-13
    • 2010-11-28
    • 1970-01-01
    • 2018-05-10
    • 2018-06-02
    • 1970-01-01
    • 2014-07-23
    • 2011-02-20
    相关资源
    最近更新 更多