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

时间:2019-10-16 04:45:20

标签: reactjs typescript redux-saga 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有效载荷?

2 个答案:

答案 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
})