Как вернуть данные с помощью Axios - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь извлечь данные из вызова Axios в Javascript. Я вижу, что данные успешно вызываются, если я console.log (), находясь внутри этого блока

Вот ссылка на снимок экрана console.log (), если он находится внутри вызова axios. https://imgur.com/a/ZLXnE2n

Эти данные верны, но я не могу получить к ним доступ вне вызова Axios.

   const response = await axios
        .get(url, config)
        .then(function(response) {
          data = response.data;
          console.log(data)
        })

Однако я не могу ничего сделать с данными вне функции getRide_Uber. Как извлечь объект ответа для использования в других частях моего кода?

const axios = require("axios");

// Use the Uber API to estimate the cost between two
// locations specified via latitude and longitude coordinates.

getRide_Uber = async (addressOrigin, addressDestination) => {
  let origin = await geocodeAddress(addressOrigin);
  let destination = await geocodeAddress(addressDestination);

  const url = "https://api.uber.com/v1.2/estimates/price";

  const config = {
    headers: {
      Authorization: `Token ${process.env.UBER_SERVER_TOKEN}`
    },
    params: {
      start_latitude: origin.lat,
      start_longitude: origin.lon,
      end_latitude: destination.lat,
      end_longitude: destination.lon
    }
  };

  const response = await axios
    .get(url, config)
    .then(function(response) {
      data = response.data;
      return data;
    })
    .catch(function(error) {
      console.log(error);
    });
  return response;
};

// Initial code
// const rideData = getRide_Uber("Arlington Texas", "Fort Worth Texas");
// const ridePrices = rideData.prices;
// console.log(ridePrices);

// Code suggestion by @mralanlee
const a = (async() => {
 const result = await getRide_Uber(start, dest);
 return result;
})();

console.log(a); // Console just says <pending>
const prices = a.prices // undefined

Пожалуйста, дайте мне знать, если что-то потребует разъяснений, и я буду рад объяснить. Спасибо!

1 Ответ

1 голос
/ 20 марта 2019

Хранилище данных возвращается в getRide_Uber.

Вы можете сделать его доступным или возвращенным глобально, например:

(async() => {
 const result = await getRide_Uber(start, dest);
 // or console.log(result)
 return result;
})()

или

const a = (async() => {
     const result = await getRide_Uber(start, dest);
     return result;
})();

Для вышеприведенного решения вам нужно иметь это в виде другой функции async. Это не будет работать на глобальном уровне, потому что регистрация результата не будет ждать разрешения Promise. Вы должны обернуть его в функцию async и дождаться анонимной функции.

Редактировать: Уточнение, чтобы добавить больше ясности ...

Чтобы использовать второе решение, вы можете сделать следующее:

// this async function wraps around your code, we'll call it something for a lack of a better name
// start and dest params are passed into getRide_Uber
async function something(start, dest) {
  const result = await getRide_Uber(start, dest);
  // You can make sure you have the resolved data here.
  // console.log(result.prices)
  return result;
};

// now call the function
something(start, dest);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...