Как получить результаты снекфетча в объект?

Я пишу бота discord.js и пытаюсь вызвать погодный API с помощью Node.js / snekfetch. Проблема в том, что я не могу понять, как просто поместить данные, возвращаемые из API, в объект javascript. Я хочу сделать что-то вроде этого:

let [country, ...city] = args;
let url = `http://api.openweathermap.org/data/2.5/forecast?q=${city},${country}&units=metric&APPID=${config.weatherID};`;

var weatherObject;
snekfetch.get(url).then(r => weatherObject = r.body);`

но, очевидно, это не работает, так что я делаю не так? Кажется, это должно быть безумно просто, но я просто не могу этого сделать. Ничего из того, что я искал в Google, не помогло, так как snkfetch, похоже, не получил широкого распространения, и я был совершенно неспособен экстраполировать что-либо, что я узнал о обещаниях, на этот сценарий.

Обновлено: уточнить:

snekfetch.get(url).then(r => console.info(r.body));

выводит объект на консоль точно так, как ожидалось, в то время как

snekfetch.get(url).then(r => weatherObject = r.body);
console.info(weatherObject);

печатает undefined. Что-то мне не хватает в том, как работают операторы .then ()?

Не очевидно, что это не работает. Что не работает? Есть ошибка? В чем ценность weatherObject и чего вы от него ожидаете? Ваш код явно не сломан, поэтому без дополнительной информации вам сложно помочь.

Hydrothermal 11.01.2019 03:57

Кроме того, автор snekfetch отказался от этого пакета и рекомендовал node-fetch в качестве альтернативы.

Hydrothermal 11.01.2019 03:57

@Hydrothermal спасибо за ответ! Я обновил свой исходный вопрос, чтобы, надеюсь, прояснить, что я пытаюсь сделать, и какие результаты я получаю. Я знаю, что node-fetch предназначен для замены snekfetch, но я уже использую последний в нескольких местах своего кода, и он отлично работает везде, поэтому я стараюсь избегать переключения, если могу.

Jess 11.01.2019 13:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
1 197
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Операторы .then() не заставляют программу ждать их завершения, они просто выполняют свой код после разрешения Обещать, к которому они прикреплены. Это означает, что вы не можете надежно использовать значение, которое было установлено внутри обещания, потому что код после обещания, вероятно, будет выполнен до того, как это обещание разрешится.

Вы можете либо перенести остальной код внутри этого оператора .then(), либо использовать async/await.
. Если вы находитесь внутри функции, вы можете объявить ее как async function:, что позволяет вам использовать внутри нее ключевое слово await. await заставляет программу ждать разрешения обещания и вместо обещания возвращает значение, которое вы использовали бы в функции .then(). Вот пример:

// Instead of using this: 
function getResult(args) {
  let [country, ...city] = args;
  let url = `http://api.openweathermap.org/data/2.5/forecast?q=${city},${country}&units=metric&APPID=${config.weatherID};`;

  var weatherObject;
  snekfecth.get(url).then(response => {
    weatherObject = response.body;
  });

  return weatherObject; // undefined :(
}

// You could write it like this:
async function getResult(args) {
  let [country, ...city] = args;
  let url = `http://api.openweathermap.org/data/2.5/forecast?q=${city},${country}&units=metric&APPID=${config.weatherID};`;

  let response = await snekfecth.get(url);
  var weatherObject = response.body;

  return weatherObject; // right value
}

Это почти работает, но теперь значение weatherObject выводится на консоль как «Promise {<pending>}». Я все еще что-то упускаю?

Jess 11.01.2019 17:12

Ой, неважно, заставил его работать, переместив остальной код в функцию getResult! Большое спасибо за помощь ^^

Jess 11.01.2019 17:20

Рад слышать это :)

Federico Grandi 11.01.2019 20:54

Другие вопросы по теме