redux-saga API 调用返回什么?(举个例子)

Cer*_*ean 5 javascript reactjs redux redux-saga

我对 redux-saga 很陌生,正在阅读文档。我不明白的一件事是,具体而言,API 调用return 是什么。

当我说“返回”时,我想我是在问两件事

  • 文档中所谓的“工厂函数”的返回值是什么?(也就是说,这里https://redux-saga.js.org/docs/advanced/Testing.html文档指出“由于 Sagas 总是产生一个效果,并且这些效果具有简单的工厂函数(例如 put、take 等) )”,一般来说,这些工厂函数的返回值是什么?

  • yield当编辑到 redux-saga 中间件时,这些“工厂函数”的返回值是多少?

例如,在文档(https://redux-saga.js.org/docs/advanced/Concurrency.html)中,他们有

import {fork, take} from "redux-saga/effects"

const takeEvery = (pattern, saga, ...args) => fork(function*() {
  while (true) {
    const action = yield take(pattern)
    yield fork(saga, ...args.concat(action))
  }
})
Run Code Online (Sandbox Code Playgroud)

通过观察,我明白,takeyielded 返回与action模式匹配的值时。因此我认为它始终是返回值。所以这里(https://redux-saga.js.org/docs/advanced/NonBlockingCalls.html

function* loginFlow() {
  while (true) {
    const {user, password} = yield take('LOGIN_REQUEST')
    const token = yield call(authorize, user, password)
    if (token) {
      yield call(Api.storeItem, {token})
      yield take('LOGOUT')
      yield call(Api.clearItem, 'token')
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

userpassword返回的操作中是否有字段?

但是这个记录在哪里,take当 ed 时yield,返回操作?我查看了 的文档take,虽然对它的作用有相当好的描述,但我没有看到它返回什么。

一般来说,由于我的新手身份,我是否缺少一些关于 API 调用及其返回值的基本假设?或者——这是一种明显的可能性——我可能只是忽略了它提到返回值的地方。

感谢您的任何见解 - 如果您知道一个好的替代方案,对 redux-saga 的全面概述,我欢迎任何链接。我一直在仔细研究教程和博客文章,但希望深入了解。

And*_*eev 6

redux-saga 是如何工作的

好的,我对 redux-saga 的工作原理的看法。

首先,对于 redux-saga,您正在使用ES6 生成器函数进行编写。生成器功能的工作原理就像音乐盒:当您转动手柄时,它会一个接一个地播放音符。当你停下来,它就停下来。

在我们的例子中,是 redux-saga 运行时转动手柄。注释是你的传奇产生的效果。

您编写的生成器函数是完全被动的。它们产生称为效果的简单对象。您可以打印效果来看看它的样子:

console.log(take('SOME_ACTION'))
Run Code Online (Sandbox Code Playgroud)

你会发现它只是一个对象。该take()函数只是创建这样一个对象,它没有副作用。yield例如,如果您忘记使用,则不会发生任何事情。

take() 的工作原理

假设您take()从您的传奇中产生了效果:

const action = yield take('SOME_ACTION')
Run Code Online (Sandbox Code Playgroud)

当 redux-saga 运行时执行你的 saga 时,它会执行如下操作:

// It initializes the generator
let gen = yourSaga()

// And then it turns the handle,
// extracting effects that you yield, one by one
while (true) {
  // ...
  const effect = gen.next().value
  // Now redux-saga analyses your effect, and executes what you asked for
  // ...
}
Run Code Online (Sandbox Code Playgroud)

当它最终发现你的take()效果时,它会停止并推迟生成器以供稍后使用。

稍后,当 redux-saga 运行时检测到SOME_ACTION已分派时,它会找到您的生成器并继续执行它:

gen.next(action).value
Run Code Online (Sandbox Code Playgroud)

但这次 redux-saga 使用了音乐盒所没有的生成器功能。Redux-saga 运行时提供通过该next()函数检测到的操作。然后,您传递给的内容将成为生成器内表达式next()的值。yield ...

我希望这对您有所帮助,因为 redux-saga 文档经常会谈到生成器。