использование топора ios с API обещаний - PullRequest
0 голосов
/ 10 марта 2020

Я использую хук на основе обещаний в приложении React для извлечения асинхронных c данных из API.

Я также использую Ax ios, http-клиент на основе обещаний для вызова API .

Является ли анти-паттерн использовать клиент на основе обещания внутри другого обещания? Код ниже, похоже, не работает.

const getData = () => {
  return new Promise((resolve, reject) => {
    const url = "/getData";
    axios.get(url)
      .then(function(response) {
        resolve(response);
      })
      .catch(function(error) {
        reject(error);
      });
  });

const useAsync = (asyncFunction) => {
  const [value, setValue] = useState(null);

  const execute = useCallback(() => {
    setPending(true);
    setValue(null);
    setError(null);
    return asyncFunction()
      .then(response => setValue(response))
      .catch(error => setError(error))
      .finally(() => setPending(false));
  }, [asyncFunction]);

  useEffect(() => {
      execute();
  }, [execute]);

  return { execute, pending, value, error };
};
};

const RidesList = () => {
  const {
    pending,
    value,
    error,
  } = useAsync(getData);

1 Ответ

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

О человек. Я думаю, у вас есть фундаментальное недоразумение о том, как работают Обещания. Во-первых, ax ios уже возвращает Promise по умолчанию. Таким образом, вся ваша первая функция getData может быть уменьшена до:

const getData = () => {
  const url = "/getData"
  return axios.get(url)
}

Но содержание вашего кода, похоже, указывает на то, что вы хотите получить обещаемое Обещание - так что вы можете проверить его состояние по любой причине. Вот пример того, как вы это сделаете, адаптированный из этого фрагмента :

function statusPromiseMaker(promise) {
  if (promise.isResolved) return promise
  let status = {
    pending: true,
    rejected: false,
    fulfilled: false
  }
  let result = promise.then(
      resolvedValue => {
        status.fulfilled = true
        return resolvedValue
      },
      rejectedError => {
        status.rejected = true
        throw rejectedError
      }
    )
    .finally(() => {
      status.pending = false
    })

  result.status = () => status
  return result
}

Таким образом, вы можете сделать что-то вроде let thing = statusPromiseMaker(getData()) и если вы посмотрите вверх thing.status.pending вы получите true или false et c ...

Я на самом деле не запускал то, что выше, возможно, я забыл скобку или два, но, надеюсь, это поможет.

Я должен признать - я не видел ничего подобного в дикой природе. Мне интересно знать, чего вы на самом деле пытаетесь достичь sh этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...