【发布时间】:2018-07-27 16:21:36
【问题描述】:
名为 testing.js 的文件
我可以对 saveWeatherData 中的数据做任何我喜欢的事情,但不能调用此函数并返回数据而不会得到“未定义”
例如,如果我在 saveWeatherData 中尝试了以下代码,它将按预期打印出摘要......
控制台.log(The summary of the weather today is: ${dataArray[0]});
但是我想在另一个文件(例如服务器文件)中使用这些值,当连接到该文件时将显示天气摘要温度等。 所以我需要返回一个包含这些值的数组,这样我就可以调用这个函数并将我的数据存储在一个数组中以供进一步使用。
我知道数组 --dataArray 返回 undefined 的原因是因为异步代码。 数组在我们使用回调获取数据之前返回。
我的问题,有没有做我想做的事? 我尽力解释了这个问题以及我想做什么,希望它可以理解。
我必须在回调中使用回调吗?在这里回调以在获取数据时返回数据? 我只是无法理解它,并尝试了多种方法来尝试获得我正在寻找的结果。
我的最后一个想法也是我不想做的事情是使用“fs”模块将数据保存到文本或 json 文件中,以便通过从保存的文件中读取数据在我的其他文件中使用...
我觉得我很接近但无法克服最后一个障碍,所以我决定寻求一点帮助,即使只是指出我在正确的轨道上,我会继续尝试找出答案。 呼……
感谢您的宝贵时间!
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...");
【问题讨论】:
-
不,
saveWeatherData无法工作。您需要导出getWeatherData,然后您需要传递使用data作为回调的代码。
标签: javascript node.js asynchronous callback return