将有效载荷从一个传奇传递到另一个传奇
Pass payload from one saga to another saga
我需要将负载从 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
负载?
在 fetchTokens()
.
中使用 action.payload
进行调度时,您应该有一个 payload
键
yield put({
type: types.FETCH_TOKENS,
payload: USER_CREDS // add payload
})
您是直接调度原始对象,而不是使用动作创建器,因此您需要将 USER_CREDS
放在 payload 键下:
yield put({ type: types.FETCH_TOKENS, payload: USER_CREDS })
如果您有像
这样的动作创作者
function fetchTokensActionCreator(userCreds) {
return {
type: types.FETCH_TOKENS,
payload: userCreds,
};
}
你可以改为 yield put(fetchTokensActionCreator(USER_CREDS));
我需要将负载从 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
负载?
在 fetchTokens()
.
action.payload
进行调度时,您应该有一个 payload
键
yield put({
type: types.FETCH_TOKENS,
payload: USER_CREDS // add payload
})
您是直接调度原始对象,而不是使用动作创建器,因此您需要将 USER_CREDS
放在 payload 键下:
yield put({ type: types.FETCH_TOKENS, payload: USER_CREDS })
如果您有像
这样的动作创作者function fetchTokensActionCreator(userCreds) {
return {
type: types.FETCH_TOKENS,
payload: userCreds,
};
}
你可以改为 yield put(fetchTokensActionCreator(USER_CREDS));