【发布时间】:2020-08-15 15:03:20
【问题描述】:
我正在尝试理解 redux-saga 文档的 Non-blocking calls 部分并坚持使用以下代码
import { fork, call, take, put } from 'redux-saga/effects'
import Api from '...'
function* authorize(user, password) {
try {
const token = yield call(Api.authorize, user, password)
yield put({type: 'LOGIN_SUCCESS', token})
yield call(Api.storeItem, {token})
} catch(error) {
yield put({type: 'LOGIN_ERROR', error})
}
}
function* loginFlow() {
while (true) {
const {user, password} = yield take('LOGIN_REQUEST')
yield fork(authorize, user, password)
yield take(['LOGOUT', 'LOGIN_ERROR'])
yield call(Api.clearItem, 'token')
}
}
解释说
如果在用户注销之前授权失败,它将调度一个 LOGIN_ERROR 操作,然后终止。因此 loginFlow 将在 LOGOUT 之前获取 LOGIN_ERROR,然后它将进入另一个 while 迭代并等待下一个 LOGIN_REQUEST 操作。
我无法真正理解语句所以 loginFlow 将在 LOGOUT 之前获取 LOGIN_ERROR 然后它会进入另一个 while 迭代并等待下一个 LOGIN_REQUEST 操作。
谁能解释yield put({type: 'LOGIN_ERROR', error})和yield take(['LOGOUT', 'LOGIN_ERROR'])之间的关系?
【问题讨论】:
标签: javascript reactjs react-native redux redux-saga