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

What do redux-saga API calls return? (take, for example)

我是 redux-saga 的新手,正在通读文档。我不明白的一件事是 API 调用 return

当我说 "return" 时,我想我在问两件事

例如,在文档 (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))
  }
})

我了解到,通过查看它,这里 takeyield 编辑 return 时 action 与模式匹配。因此我认为它始终是 return 值。所以这里 (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')
    }
  }
}

userpassword 是 returned 操作中的字段?

但是,当 yield 编辑 return 时,take 记录在何处?我查看了 take 的文档,虽然对它的作用有相当好的描述,但我没有看到 return 的内容。

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

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

第一次研究 sagas。

据我理解,take类似于一个监听器。 在您的示例中,用户已登录,然后 taking 第一个 LOGOUT 将发生。

在这种情况下,等待注销意味着您正在等待操作 LOGOUT 被调度。因此,您将获得随注销发送的参数。

注销可能按如下方式调度

put({type: 'LOGOUT', ...params})

params 是您使用 take.

收听 LOGOUT 时得到的结果

redux-saga 的工作原理

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

首先,对于 redux-saga,您正在使用 ES6 generator functions 编写。生成器函数就像一个音乐盒:当您转动手柄时,它会一个一个地播放音符。你一停,它就停了。

在我们的例子中,是 redux-saga 运行时来控制。注释是您的传奇产生的效果。

您编写的生成器函数是完全被动的。它们产生称为 effects 的普通对象。你可以打印一个效果看看效果如何:

console.log(take('SOME_ACTION'))

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

take() 的工作原理

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

const action = yield take('SOME_ACTION')

当 redux-saga runtime 执行你的 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
  // ...
}

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

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

gen.next(action).value

不过这次redux-saga使用了一个八音盒没有的生成器特性。 Redux-saga 运行时提供通过 next() 函数检测到的操作。您传递给 next() 的内容将成为生成器中 yield ... 表达式的值。

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