Javascript 是否可以在节点中按需调用module.exports?

Javascript 是否可以在节点中按需调用module.exports?,javascript,arrays,node.js,Javascript,Arrays,Node.js,我有一个应用程序,在这个应用程序中,我调用一个API来获取标题和摘要JSON,并通过套接字将数据发送回客户端。我将所有代码模块化,并使用不同的文件来保持组织。我有我的index.js文件,在这里我只调用函数从API获取数据,newsDataFetcher.js是我使用请求模块向API请求数据的地方。我的问题是,由于我发出的请求是异步的,因此数据不会传递到主服务器文件,因此套接字不会发送任何数据。对API的请求完成后,我将数据放入一个数组,该数组位于我的newsDataFetcher.js文件的模

我有一个应用程序,在这个应用程序中,我调用一个API来获取标题和摘要JSON,并通过套接字将数据发送回客户端。我将所有代码模块化,并使用不同的文件来保持组织。我有我的
index.js
文件,在这里我只调用函数从API获取数据,
newsDataFetcher.js
是我使用请求模块向API请求数据的地方。我的问题是,由于我发出的请求是异步的,因此数据不会传递到主服务器文件,因此套接字不会发送任何数据。对API的请求完成后,我将数据放入一个数组,该数组位于我的
newsDataFetcher.js
文件的
模块中。导出
,以及发出实际请求的函数。因此,由于数组位于
模块.exports
中,因此当我需要
index.js
文件中的
newsDataFetcher.js
文件时,会传递一个空数组。因此,这就引出了一个问题:是否仍有调用
module.exports
“随需应变”的方法,以便它不会传递空数组,而只在从API下载完数据后才传递数组

index.js

var newsDataFetcher = require('./newsDataFetcher');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var news = []; //array for news headlines and abstracts

app.set('view engine', 'ejs');
app.use(express.static(__dirname + '/views/routes/'));
server.listen(8888);
console.log("Running server on http://localhost:8888 ....");

newsDataFetcher.getNewsData();
news = newsDataFetcher.news;
setInterval(function () {
    newsDataFetcher.getNewsData();
    news = newsDataFetcher.news;
}, 6000000);
setInterval(function () {
    sendAllData()
}, 1000);

function sendAllData() {
    io.sockets.emit('news', news);
}
newsDataFetcher.js
文件:

var request = require('request');
var nyTimesApi = "http://api.nytimes.com/svc/topstories/v1/home.json?api-key=" + nyTimesApiKey_DEV;

var news = []; //array for news headlines and abstracts

function getNewsData() {
    request({
        url: nyTimesApi,
        json: true
    }, function (err, res, body) {
        news = body.results;
    });


}



module.exports = {
    getNewsData: getNewsData,
    news: news
}

您可以这样做:

// newsDataFetcher.js
module.exports = {
    getNewsData: getNewsData,
    news: function() {
        return news;
    }
}

// index.js
io.sockets.emit('news', newsDataFetcher.news());

您可以使用单例模式来实现这一点

class NewsDataFetcher {
    constructor() {
        this.news = [];
    }

    getNewsData() {
         const self = this;
         request({
             url: nyTimesApi,
             json: true
         }, function (err, res, body) {
             self.news = body.results;
         });
    }
}
module.exports = new NewsDataFetcher();
在主页上

var newsDataFetcher = require('./newsDataFetcher');
newsDataFetcher.getNewsData(); // to fetch new data;
// To get news data
console.log(newsDataFetcher.news); // will always refer to one instance of news since you are using singleton.