Передача полезных данных из одной саги в другую - PullRequest
1 голос
/ 16 октября 2019

Мне нужно передать полезную нагрузку от 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 ]

2 голосов
/ 16 октября 2019

Вы напрямую отправляете необработанный объект, не используя создателя действия, поэтому вам нужно поставить 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 голос
/ 16 октября 2019

Вы должны иметь клавишу payload при отправке, так как вы используете action.payload в fetchTokens().

yield put({
  type: types.FETCH_TOKENS,
  payload: USER_CREDS // add payload
})
...