redux-saga API调用返回什么? (例如)

时间:2018-11-23 17:32:20

标签: javascript reactjs redux redux-saga

我是redux-saga的新手,正在阅读文档。我不了解的一件事是什么,特别是API调用了 return

当我说“ 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))
  }
})

从查看的角度来看,我了解到take的{​​{1}}返回与模式匹配的yield。因此,我认为它始终是返回值。因此,这里(https://redux-saga.js.org/docs/advanced/NonBlockingCalls.html

action

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') } } } user是返回的操作中的字段吗?

但是,passwordtake返回时,该动作在哪里记录?我去过yield的文档,尽管对它的功能有相当不错的描述,但我没有看到它返回的内容。

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

感谢您提供任何见解-如果您知道redux-saga的替代方案和完整概述,欢迎您提供任何链接。我一直在研究教程和博客文章,但希望能深入了解它。

2 个答案:

答案 0 :(得分:1)

第一次看萨加斯。

据我了解,File "mqtt1.py", line 25, in write cur.execute("INSERT INTO tblMQTTtest (string) VALUES (%s)", (var1)) TypeError: not all arguments converted during string formatting 与侦听器相似。 在您的示例中,用户先登录,然后take首先登录taking

在这种情况下,等待注销意味着您正在等待调度LOGOUT操作。这样您将获得注销时分派的参数。

注销可能会如下分派

LOGOUT

put({type: 'LOGOUT', ...params}) 是您在听着params的音乐时得到的东西。

答案 1 :(得分:1)

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运行时执行您的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文档经常会谈论发电机。