#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! Это помогает мне намного лучше понять эту концепцию. Вы были очень полезны