redux-saga API 调用什么 return? (举个例子)
What do redux-saga API calls return? (take, for example)
我是 redux-saga 的新手,正在通读文档。我不明白的一件事是 API 调用 return。
当我说 "return" 时,我想我在问两件事
文档中所谓的 "factory function" 的 return 值是多少? (也就是说,这里 https://redux-saga.js.org/docs/advanced/Testing.html 文档声明 "Since Sagas always yield an Effect, and these effects have simple factory functions (e.g. put, take etc.)",一般来说,这些工厂函数的 return 值是多少?
当 yield
ed 到 redux-saga 中间件时,这些 "factory functions" 的 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))
}
})
我了解到,通过查看它,这里 take
当 yield
编辑 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')
}
}
}
user
和 password
是 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 文档经常谈到生成器。
我是 redux-saga 的新手,正在通读文档。我不明白的一件事是 API 调用 return。
当我说 "return" 时,我想我在问两件事
文档中所谓的 "factory function" 的 return 值是多少? (也就是说,这里 https://redux-saga.js.org/docs/advanced/Testing.html 文档声明 "Since Sagas always yield an Effect, and these effects have simple factory functions (e.g. put, take etc.)",一般来说,这些工厂函数的 return 值是多少?
当
yield
ed 到 redux-saga 中间件时,这些 "factory functions" 的 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))
}
})
我了解到,通过查看它,这里 take
当 yield
编辑 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')
}
}
}
user
和 password
是 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 文档经常谈到生成器。