Как вернуть данные с помощью Axios

#javascript #node.js #http #npm #axios

#javascript #node.js #http #npm #axios

Вопрос:

Я пытаюсь извлечь данные из вызова 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. Как мне извлечь объект response для использования в других частях моего кода?

 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 resu<
})();

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

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

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

1. getRide_Uber данные будут сохранены, если они будут выполнены. итак, если бы я сделал что-то подобное const a = getRide_Uber(start, dest); , тогда у a будут данные ответа, поскольку вы их возвращаете.

2. Не могли бы вы объяснить, что вы подразумеваете под «невозможностью что-либо сделать с данными»? Не могли бы вы добавить пример вызова getRide_Uber?

3. Привет @thibpat Я добавил пример вызова, а также добавил ссылку на скриншот консоли с желаемыми данными. Под невозможностью что-либо сделать с данными я подразумеваю, что данные, которые я пытаюсь извлечь из этой функции, не определены. Поэтому всякий раз, когда я console.log (цены) Вместо массива я получаю undefined. Я также не могу углубиться в объект, поэтому, если я наберу rideDistance = rideData.prices[0].distance; Программа выдаст ошибку.

4. Здравствуйте @mralanlee Я добавил предлагаемое изменение, и данные отображаются как неопределенные. У вас есть какие-либо идеи относительно того, почему это происходит? Спасибо

5. Вам не нужно await для getRide завершения.

Ответ №1:

Хранилище данных снова подключено getRide_Uber .

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

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

или

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

Для вышеупомянутого решения вам нужно было бы иметь это в области другой 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 resu<
};

// now call the function
something(start, dest);
  

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

1. Спасибо за помощь мне @mralanlee. Я использую const a = (async() => { const result = await getRide_Uber(start, dest); return resu< })(); и когда я console.log(a); Консоль просто говорит <ожидание>, а затем ничего не возвращает. Если я затем попробую prices = a.prices, я все еще получаю undefined. Чего мне не хватает?

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

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

4. Спасибо @mralanlee! Это помогает мне намного лучше понять эту концепцию. Вы были очень полезны