我有一个应用程序,我调用API来获取头条新闻并消化JSON并通过套接字将数据发送回客户端。我已经模块化了我的所有代码,并使用不同的文件来保持井井有条。我有index.js
文件,我只调用函数来从API获取数据,newsDataFetcher.js
是我使用请求模块向API请求数据的地方。我的问题是,由于我所提出的请求是异步的,因此数据不会传递到主服务器文件,因此套接字不会发送任何数据。在对API的请求完成后,我将数据放入一个数组中,该数组位于module.exports
文件的newsDataFetcher.js
中,以及发出实际请求的函数。因此,由于数组位于module.exports
中,因此当我需要newsDataFetcher.js
文件中的index.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
}
答案 0 :(得分:0)
你可以这样做:
// newsDataFetcher.js
module.exports = {
getNewsData: getNewsData,
news: function() {
return news;
}
}
// index.js
io.sockets.emit('news', newsDataFetcher.news());
答案 1 :(得分:0)
您可以使用单例模式来实现此目的。
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.