@Zewkin
Я у мамы фронтэндер

Почему не работает redux-saga?

Привет! Вроде просто все:

const getAccounts = function* getAccounts() {
  while (true) {
    const request = yield take(GET_ACCOUNTS);
    const userID = request.data.userID;
    try {
      response = yield call(AccountsService.getAccounts, userID);    // тут асинхронный вызов
      yield put({ type: ACCOUNTS_RECEIVED, response });
    } catch (error) {
      return false;
    }
  }
}


Редьюсер

export const accounts = (state = INITIAL_STATE, action) => {
  switch (action.type) {
    case ACCOUNTS_RECEIVED:
      console.log(action);  // тут action.response - undefined
      return { ...state, accounts: action.response.Items[0].accounts };
    case ADD_ACCOUNT:
      return { ...state, accounts: [ ...state.accounts, action.newAccount ] };
    default:
      return state;
  }
};


Сага не ждет, пока асинхронная функция вернет значение, сразу диспетчит ACCOUNTS_RECEIVED с пустым response. Почему?

Спасибо.
  • Вопрос задан
  • 97 просмотров
Решения вопроса 1
  • rockon404
    @rockon404
    Frontend Developer
    У вас ошибка тут:
    export const getAccounts = (userID) => {
      fetch(`${BASE_URL}/users/${userID}/accounts/`).then(resp => {
        resp.json().then(accounts => accounts.Items[0].accounts);
      })
    }

    Ничего не возвращаете.

    Исправить так:
    export const getAccounts = userID =>
      fetch(`${BASE_URL}/users/${userID}/accounts/`).then(resp => {
        resp.json().then(accounts => accounts.Items[0].accounts);
      });


    И лучше используйте axios, вместо fetch

    Сущность Service бесполезна в данной архитектуре, импортируйте и используйте функцию напрямую:
    response = yield call(getAccounts, userID);
    Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы