Node.js如何从异步回调中返回数组以在另一个文件中使用

时间:2018-07-27 16:21:36

标签: javascript node.js asynchronous callback return

名为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...");

1 个答案:

答案 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
};

它将在每个请求中检查新的天气。如果要保存结果以避免每次都检查,则可能需要执行其他操作。但是我认为对于气象应用程序而言,重要的是保持其更新。