Лучшая практика при попытке использовать асин c код внутри действия - PullRequest
0 голосов
/ 12 марта 2020

Я работаю над проектом React Native with Expo, сейчас я пытаюсь удалить элемент из списка в локальной базе данных. Проблема в действии, куда я его отправляю. Вот мой код.

  export const eliminatePlace = (placeId) => {
    console.log(`Inside the action with placeID ${placeId}`);
    return async dispatch => {
      console.log('returned');
      try {
        const dbResult = await deletePlace(placeId);
        console.log(dbResult);
        dispatch({
          type: DELETE_PLACE,
          id: placeId
        });
      } catch (err) {
        throw err;
        console.log(err);
      }
    };
  }

Каким-то образом консоль.log внутри возврата не сработала, мой обходной путь был таким:

export const eliminatePlace =  async (placeId, dispatch) => {

  try {
    console.log(`Trying to eliminate place with ID ${placeId}`);
    const dbResult = await deletePlace(placeId);
    console.log(dbResult);
    dispatch({type: DELETE_PLACE, id: placeId});
  } catch (err) {
    throw err;
    console.log(err);
  }

};

Тогда это сработало, но это не лучшая практика, есть идеи, почему правильный путь не сработал? Вот ссылка на мой репозиторий github, где вы можете скачать проект: https://github.com/josmontes/rn-places Если кому-то нужно увидеть другое место кода, пожалуйста, спросите, я больше ничего не добавил, поэтому он не делает Раздувает вопрос и потому, что проблема находится внутри этой функции.

1 Ответ

1 голос
/ 12 марта 2020

Вы не должны вызывать асин c функции внутри создателей ваших действий. Вы можете узнать больше о том, почему здесь . Вместо этого вы должны использовать асин c действия. Даже если вы не выполняете вызов API, вы все равно можете представить свой процесс как запрос-успех-сбой. По сути, отправьте действие «запрос» и в качестве побочного эффекта вызовите вашу асин c функцию. После разрешения вы отправляете действие «успех» или «сбой», в зависимости от результата. Затем вы можете поместить результаты из базы данных в полезную нагрузку действия «success». Вы можете прочитать больше об этом здесь .

Я полагаю, что второй пример, который вы дали, работает, потому что это в основном всего лишь действие "успеха". Он отправляет обычное действие только после разрешения функции asyn c, в то время как в первом примере самой функцией действия является asyn c, что избыточно не нравится.

...