如何将snekfetch结果获取到对象中?

时间:2019-01-11 01:02:22

标签: javascript node.js discord discord.js

我正在编写一个discord.js机器人,并尝试使用Node.js / snekfetch调用天气API。问题是我无法弄清楚如何仅将从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);`

但是显然这不起作用,所以我在做什么错?看起来它应该非常简单,但我做不到。由于snekfetch似乎并未得到广泛使用,而且我完全无法推断出我对这种情况下的承诺所学到的任何信息,因此我一直在搜索的内容无济于事。

编辑:要澄清:

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

完全按照预期将对象打印到控制台,而

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

打印未定义。 .then()语句的工作方式我缺少什么?

1 个答案:

答案 0 :(得分:0)

.then()语句不会使程序等待它们完成,它们只是在解析附加的Promise之后执行代码。
这意味着您不能可靠地使用Promise内设置的值,因为Promise之后的代码可能会在Promise解析之前执行。

您可以决定将其余代码移至该.then()语句中,也可以使用async/await
如果在函数内部,则可以将其声明为async function:允许您在函数内部使用await关键字。 await使程序等待Promise解决,而不是Promise,它返回您将在.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
}