名为testing.js的文件
我可以对saveWeatherData中的数据做任何我想做的事,但是不能调用此函数并返回数据而不会得到“ undefined”
例如,如果我在saveWeatherData中尝试了以下代码,它将按预期打印出摘要...
console.log(The summary of the weather today is: ${dataArray[0]}
);
但是,我想在另一个文件(例如服务器文件)中使用这些值,当连接到该文件时将显示天气摘要温度等。 因此,我需要返回一个包含这些值的数组,以便可以调用此函数并将数据存储在数组中以供进一步使用。
我知道数组--dataArray返回未定义的原因是因为异步代码。 在使用回调获取数据之前,将返回数组。
我的问题是,有什么可以做的吗? 我尽力解释了这个问题以及我想做什么,希望它可以理解。
我必须在回调内部使用回调吗?要在此处回调以在获取数据时返回数据? 我只是无法理解,已经尝试了多种尝试来获得我想要的结果。
我的最后一个想法是,我不愿意做的事情是使用'fs'模块,通过从已保存的文件中读取数据,将数据保存到文本或json文件中,以便在其他文件中使用... < / p>
我感觉很近,但无法克服最后的障碍,因此我决定寻求一点帮助,甚至只是将我指向正确的轨道,病态仍会继续尝试解决。 ew ...
谢谢您的时间!
const request = require("request");
let dataArray = [];
let saveWeatherData = function(weatherData) {
dataArray = weatherData;
return dataArray;
};
let getWeatherData = function(callback) {
request({
url: `https://api.forecast.io/forecast/someexamplekey/1,-1`,
json: true
}, (error, response, body) => {
//Creating array to hold weather data until we can save it using callback...
let array = [];
if (error) {
console.log("Unable to connect with Dark Sky API servers.")
}
else {
console.log(`Successfully connected to Dark Sky API servers!\n`);
array.push(body.currently.summary, body.currently.temperature, body.currently.apparentTemperature, body.currently.windSpeed, body.currently.windBearing);
callback(array);
}
});
};
getWeatherData(saveWeatherData);
module.exports = {
saveWeatherData
};
我的其他文件... 名为server.js的文件
const http = require("http");
const testing = require("./testing");
function onRequest(request, response){
let data = testing.saveWeatherData();
console.log(`A user made a request: ${request.url}`);
response.writeHead(200, {"context-type": "text/plain"});
response.write("<!DOCTYPE html>");
response.write("<html>");
response.write("<head>");
response.write("<title>Weather</title>");
response.write("</head>");
response.write("<body>");
response.write("Weather summary for today: " + data[0]);
response.write("</body>");
response.write("</html>");
response.end();
}
http.createServer(onRequest).listen(8888);
console.log("Server is now running on port 8888...");
答案 0 :(得分:1)
我仍然不确定您要做什么。但是,我认为您没有导出您想导出的内容。为了避免使用太多的回调,您可以使用async / await。
更改server.js
的这一部分
async function onRequest(request, response) {
let data = await testing.getWeatherData();
console.log(`A user made a request: ${request.url}`);
response.writeHead(200, { 'context-type': 'text/plain' });
response.write('<!DOCTYPE html>');
response.write('<html>');
response.write('<head>');
response.write('<title>Weather</title>');
response.write('</head>');
response.write('<body>');
response.write('Weather summary for today: ' + data[0]);
response.write('</body>');
response.write('</html>');
response.end();
}
这是您的测试。
let getWeatherData = function() {
return new Promise(resolve =>
request(
{
url: `https://api.darksky.net/forecast/someexamplekey/1,-1`,
json: true
},
(error, response, body) => {
//Creating array to hold weather data until we can save it using callback...
let array = [];
if (error) {
console.log('Unable to connect with Dark Sky API servers.');
} else {
console.log(`Successfully connected to Dark Sky API servers!\n`);
array.push(
body.currently.summary,
body.currently.temperature,
body.currently.apparentTemperature,
body.currently.windSpeed,
body.currently.windBearing
);
resolve(array);
}
}
)
);
};
module.exports = {
getWeatherData
};
它将在每个请求中检查新的天气。如果要保存结果以避免每次都检查,则可能需要执行其他操作。但是我认为对于气象应用程序而言,重要的是保持其更新。