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