Почему мой redux-saga является асинхронным

#reactjs #react-native #redux #redux-saga

#reactjs #react-native #redux #redux-saga

Вопрос:

В моем приложении для реагирования я пишу компонент входа пользователя в систему, который отправляет имя пользователя и хэш на сервер, сравнивает хэш с хэшем в базе данных и возвращает результат. Я реализовал это using redux-saga :

 function* fetchUser(action) {
  try {
    const user = yield call(Api.fetchUser, action);
    yield put({type: types.USER_FETCH_SUCCEEDED, user});
  } catch (e) {
    yield put({type: types.USER_FETCH_FAILED, message: e.message});
  }
}

export function* watchFetchUser() {
  yield* takeEvery(types.USER_FETCH_REQUESTED, fetchUser);
}

export default function* rootSaga() {
  yield fork(watchFetchUser);
  // ...
}
  

И я ожидаю, что const user это будет содержать ответ от API и после запуска yield put({type: types.USER_FETCH_SUCCEEDED, user}) . Но после yield call(Api.fetchUser, action) user есть undefined . Но Api.fetchUser возвращает правильный ответ.

И я не могу найти, где моя ошибка. Почему результат const user = yield call(Api.fetchUser, action) — это undefined когда после Api.fetchUser возврата правильный ответ?

 fetchUser(action) {
    const url = `${apiUrls.LOGIN_URL}`;

    fetch(url, 'POST', action.user)
      .then(response => response.json())
      .then(res => res)
  }
  

Ответ №1:

Вы не возвращаете обещание из функции fetchUser. Это должно быть

 fetchUser(action) {
    const url = `${apiUrls.LOGIN_URL}`;

    return fetch(url, 'POST', action.user)
      .then(response => response.json())
      .then(res => res)
  }
  

Комментарии:

1. Большое вам спасибо!