我需要将有效负载从fromSaga
传递到toSaga
。问题是似乎toSaga
无法获得有效载荷。但是,如果我通过useEffect调度动作,则toSaga
将获得有效负载。我的观察是,如果您从fromSaga
分发动作,它将跳过动作创建者,而直接转到toSaga
。结果,没有有效载荷被发送到toSaga
。这是真实的代码:
const fetchTokens = function*(action: any) {
try {
const userCreds: any = toSnakeCase(action.payload) // action.payload is undefined here
const response: any = yield call(fetchTokensApi, userCreds)
if (response.status === 200) {
const data: any = response.data.data
const tokens: Tokens = {
accessToken: data.access_token,
refreshToken: data.refresh_token,
expiry: extractExpiry(data.access_token),
}
yield put({ type: types.FETCH_TOKENS_SUCCESS, tokens})
}
} catch (error) {
yield put({ type: types.FETCH_TOKENS_FAILURE, error })
}
}
export const fetchTokensSaga = function*() {
yield takeLatest(types.FETCH_TOKENS, fetchTokens)
}
const validateAccessToken = function*() {
try {
const tokens: Tokens = yield select(tokensSelector)
if (!tokens) {
yield put({ type: types.FETCH_TOKENS, USER_CREDS })
}
} catch (error) {
yield put({ type: types.FETCH_TOKENS_FAILURE, error })
}
}
在validateAccessToken
中,fetchTokensSaga
通过以下方式调用:
yield put({ type: types.FETCH_TOKENS, USER_CREDS })
fetchTokens
然后应该得到USER_CREDS
。但是,并非如此,因为payload
始终为undefined
。我该怎么做fetchTokens
得到USER_CREDS
有效载荷?
答案 0 :(得分:2)
您是直接分派原始对象,而不使用动作创建者,因此您需要将USER_CREDS
放在有效负载键下:
yield put({ type: types.FETCH_TOKENS, payload: USER_CREDS })
如果您有动作创建者,例如
function fetchTokensActionCreator(userCreds) {
return {
type: types.FETCH_TOKENS,
payload: userCreds,
};
}
您可以改而yield put(fetchTokensActionCreator(USER_CREDS));
答案 1 :(得分:1)
在payload
中使用action.payload
进行分派时,应该有一个fetchTokens()
键。
yield put({
type: types.FETCH_TOKENS,
payload: USER_CREDS // add payload
})