我正在做一个OpenWeatherMap项目,任务是从API调用中获取温度。我无法弄清楚如何将温度值从“ for”循环传递到在顶部定义的“温度”数组:
const request = require('request');
let apiKey = 'xxxxxxxxx';
let url = `http://api.openweathermap.org/data/2.5/forecast?lat=30.2240897&lon=-92.0198427000000&units=imperial&${apiKey}`
let temperature = new Array();
request(url, function (err, response, body) {
if(err){
console.log('error:', error);
} else {
let data = JSON.parse(body);
let weatherList = data.list;
for (i=0; i<weatherList.length; i++) {
temperature[i] = weatherList[i].main.temp;
}
return temperature;
}
});
任何有关如何将我从for循环中收集的值推送到“温度”数组的帮助都将非常有用!
答案 0 :(得分:0)
由于request()是一个异步调用,您的进一步处理取决于温度数组的值,因此您需要在该请求回调内的代码来访问它。 我怀疑您可能会在调用请求函数的异步代码块之后立即访问温度数组。
var arr = new Array();
setTimeout(function(){
arr.push(10);
console.log("inside async block");
console.log(arr);
}, 1000);
console.log("immediately after async block");
console.log(arr);
答案 1 :(得分:0)
使用ajax调用api或获取您正在使用的任何方法,需要一些时间才能从服务器返回响应。由于您正在进行的api调用是异步的,因此您尝试在ajax调用完成之前分配温度值。这就是温度始终为空的原因。您需要使用一些回调从api响应内部访问温度值。
赞:
request(url, function (err, response, body) {
if(err){
console.log('error:', error);
} else {
let data = JSON.parse(body);
let weatherList = data.list;
for (i=0; i<weatherList.length; i++) {
temperature[i] = weatherList[i].main.temp;
}
useTemp(temperature);
}
});
useTemp(temperature)
{
//Do something with temperature
}
答案 2 :(得分:0)
我认为您正在发生的一些事情使您退缩。
第一:请求不是基于Promise的库,因此我们需要等待响应才能返回。我们需要创建一个Promise供我们等待。
第二:ES6为我们提供了使之可读且可重复的简单方法。
以下是您的确切调用的几个示例,但是它们使用不同的方法完成:
/**
* Must await for a Promise, request does not natively return a Promise, so create one
* */
const request = require('request');
let temperature = new Array();
module.exports.getWeatherRequest = async () => {
// Create Our Returned Promise
function doRequest(url) {
return new Promise((resolve, reject) => {
request(url, function (error, res, body) {
if (error) {
reject(error)
}
resolve(JSON.parse(body));
})
})
}
/*
* Call Our Promise
**/
let resp = await doRequest(url);
/*
* For/of Loops through Object for only temps
* Push each value into temperature
**/
for (let temps of resp.list) {
temperature.push(temps.main.temp)
}
/*
* Outcome
*/
console.log('Temps : ', temperature)
}
ES6并带有Node-Fetch:
const fetch = require('node-fetch');
module.exports.getWeatherFetch = async () => {
let weather = await fetch(url)
.then(blob => blob.json())
.then(data => data)
.catch(error => { console.error(error) })
console.log('Weather Response ', weather)
// Here you'll handle the data/for of loop
}