@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. Почему?

Спасибо.
  • Вопрос задан
  • 532 просмотра
Решения вопроса 1
rockon404
@rockon404 Куратор тега React
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);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы