【问题标题】:Node.js how to return an array from within a asynchronous callback for use in another fileNode.js如何从异步回调中返回一个数组以在另一个文件中使用
【发布时间】: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


【解决方案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
};

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

【讨论】:

  • 为什么将getWeatherData() 声明为async。您没有使用await,我看不出它是async 的任何其他原因。只需将其设为返回承诺的常规函数​​即可。而且,您可以只使用request-promise 为您提供request() 的模块,因此您不必手动执行此操作。
  • 我无意使用该异步。但我想他明白了,对吧?
  • 我试图向您提供有关如何改进答案的反馈。您可以编辑您的答案以删除 getWeatherData() 上的 async,因为它不是必需的,您可以通过向他们展示如何使用 request-promise 来改进您的答案,这将比您当前显示的更简单。
  • 谢谢你,虽然我不完全理解它是如何工作的,但我会试一试,我所需要的只是有人为我指出一个新的方向,我相信我能弄清楚这个...谢谢你的时间...
  • 这非常有效,非常感谢,我也几乎全部了解。只需要多玩一点,看一些关于 es6 Promise 和 aysnc 关键字使用的视频。我有点理解异步的那部分,但必须多看一点并练习,再次非常感谢。
猜你喜欢
  • 2018-01-30
  • 2020-03-06
  • 1970-01-01
  • 2022-08-13
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
相关资源
最近更新 更多