Как обрабатывать обещанный ответ?

#javascript #reactjs #promise #async-await #axios

#javascript #reactjs #обещание #асинхронный-ожидание #axios

Вопрос:

Итак, у меня такая ситуация, когда мне нужно отправить петицию в конечную точку и получить URL-адрес серверной части, которую я действительно собираюсь использовать. У меня есть файл с конфигурацией api, в котором я создаю экземпляр с помощью axios.

Прежде чем это работало так, таким образом, я мог использовать конечную точку везде, где мне это было нужно:

 import axios from "axios";

const url =   process.env.API_URL

const instance = axios.create({
  baseURL: url,
});

export default instance;
 

Это то, что я пытаюсь сделать сейчас:

 import axios from "axios";
import qs from "qs";

const urlParams = new URLSearchParams(window.location.search);
const url_endpoint = process.env.URL_ENDPOINT;
const param = urlParams.get("param");

const data = {
  f: "json",
  outFields: "*",
  where: `search_field='${param}'`,
};

const options = {
  method: "POST",
  headers: {
    "content-type": "application/x-www-form-urlencoded",
  },
  data: qs.stringify(data),
  url: url_endpoint,
};

const getAPIurl = axios(options).then((res) => {
  console.log(res, "petition1");
  return res.data.features[0].attributes.url_base_pub;
});

const apiURL = async () => {
  const url = await getAPIurl;
  console.log(url, "petition2");
  return url;
};

const instance = axios.create({
  baseURL: apiURL(),
});

export default instance;

 

Когда я делаю console.log(apiURL()) все, что я получаю, это обещание, мне нужно передать значение URL, но я не нашел способа сделать это.

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

1. Вам нужно дождаться результата, подобного этому apiURL().then(x => console.log(x))

2. Да, дело в том, что мне нужно использовать значение x вне обещания

3. Итак, проблема в вашем const instance коде? Это то место, где вы хотите захватить результирующий URL-адрес и использовать его в другом месте? instance.baseURL ?

4. У вас есть значение только тогда, когда обещание больше не находится на рассмотрении. Таким образом, вам всегда нужно либо await или .then , чтобы получить данные — это должно пройти весь путь до того места, где нужны данные.

Ответ №1:

Вы можете попробовать что-то вроде

 const value = await apiURL();
 

Тогда у вас должен быть URL в качестве переменной значения. Поскольку вы определили apiURL() как асинхронную функцию, поэтому она всегда будет возвращать promise неявно, даже если мы явно не возвращаем promise. вы можете прочитать об этом здесь https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function