我是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
是返回的操作中的字段吗?
但是,password
被take
返回时,该动作在哪里记录?我去过yield
的文档,尽管对它的功能有相当不错的描述,但我没有看到它返回的内容。
通常,由于我的新手身份,我是否缺少一些有关API调用及其返回值的基本假设?或者-这是一种明显的可能性-我可能只是忽略了它提到返回值的地方。
感谢您提供任何见解-如果您知道redux-saga的替代方案和完整概述,欢迎您提供任何链接。我一直在研究教程和博客文章,但希望能深入了解它。
答案 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,您正在使用ES6 generator functions进行书写。生成器功能就像一个音乐盒:旋转手柄时,它会一一播放音符。当您停止时,它停止。
在我们的例子中,是redux-saga运行时打开了句柄。这些笔记是您的传奇所产生的效果。
您编写的生成器函数完全是被动的。它们产生称为 effects 的普通对象。您可以打印效果以查看效果:
console.log(take('SOME_ACTION'))
您将看到它只是一个对象。 take()
函数只是创建了这样的对象,它没有副作用。例如,如果您忘记使用yield
,则什么也不会发生。
让我们假设您的传奇故事产生了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文档经常会谈论发电机。