将有效载荷从一个传奇传递到另一个传奇

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));