javascript - 在 redux-saga 中让 yield.put 一个接一个地发生
问题描述
我让 yield.put 一个接一个地发生,因为异步行为对我来说对这个实现没有好处。
生成器函数
export function * createUser (action) {
try {
axios.defaults.headers.common['Authorization'] =
'Bearer ' + localStorage.getItem('userAccessToken')
console.log(action.payload)
const user = yield call(axios.post, api.createUser, action.payload)
yield put(actionCreators.addUserSuccess(user.data))
const qs = queryString.stringify(action.payload)
const endpoint = `${api.createUser}?${qs}`
console.log(endpoint)
const users = yield call(axios.get, endpoint)
console.log(users)
yield put(actionCreators.fetchUsersSuccess(users.data))
} catch (error) {
yield put(actionCreators.addUserFailure(error))
}
}
我有这个生成器函数,我想
在调用yield put(actionCreators.addUserSuccess(user.data))
之前完成yield put(actionCreators.fetchUsersSuccess(users.data))
对此的任何帮助将不胜感激
解决方案
以下是一些解决方法:
进行
actionCreators.addUserSuccess
阻塞actionCreators.addUserSuccess
完成后调度另一个动作
进行actionCreators.addUserSuccess
阻塞
有putResolve
用于阻止效果的效果创建器。这仅在 addUserSuccess 返回您需要解决的承诺时才有用。
const response = yield putResolve(actionCreators.addUserSuccess(user.data))
// use resolved promise in next operation
actionCreators.addUserSuccess completes
在)时调度另一个动作
哪里actionCreators.addUserSuccess
不返回承诺,这是一个更好的方法。
完成后调度另一个动作actionCreators.addUserSuccess
然后take
该动作。
while (true) {
// say this is the action type that is dispatched in the
// middleware that runs actionCreators.addUserSuccess
const action = yield take('FETCH_USERS');
yield put(actionCreators.fetchUsersSuccess(action.users.data))
}
推荐阅读
- regex - Powershell中的正则表达式用于获取程序集版本号
- python - 在不安装依赖项的情况下启动 python 脚本
- javascript - 诗乃 useFakeTimers 嘲笑延迟承诺超时
- r - 基于现有列创建多个新列 (dplyr)
- javascript - 如何在 create-react-app 中将虚拟服务器数据提供给 devserver
- sql - 获取使用符合某些条件的 hierarchyId 创建的树中的最低级别
- c# - 添加sql WHERE语句以选择数据库中的新ID:s(asp / sql)
- java - 具有多个权限的 ActivityResultLauncher
- nginx - Kibana 的 nginx Reverseproxy 在 kubernetes 上提供空仪表板
- python - TensorFlow/Keras 使用特定类召回作为稀疏分类交叉熵的度量