В настоящее время у меня есть обработчик данных для удаленного файла JSON, который обновляется на сервере каждые 2 минуты, обработчик загружает файл JSON и в нем есть несколько методов, которые могут получать различную информацию из Это. Обработчик, за исключением методов, которые возвращают данные, выглядит следующим образом:
const fs = require('fs');
const request = require('request');
const EventEmitter = require('events');
class DataHandler extends EventEmitter {
constructor() {
super();
this.shouldUpdate.bind(this);
}
updateTimer = setInterval(this.update.bind(this), 120000);
async shouldUpdate() {
if (!fs.existsSync('vatsimData.json')) await this.initialUpdate();
const file = fs.readFileSync('vatsimData.json');
const parsed = JSON.parse(file);
const oldDT = Date.parse(parsed.updated_date);
const dateDifference = Date.now() - oldDT;
const minutes = Math.floor(dateDifference / 60000);
if (minutes >= 2) await this.update();
return false;
}
async update() {
fs.copyFile('vatsimData.json', 'oldData.json', (err) => {
if (err) console.log(err);
});
let body = await this.downloadFile();
const parsedJSON = JSON.parse(body);
parsedJSON.updated_date = new Date();
const json = JSON.stringify(parsedJSON);
fs.writeFileSync('vatsimData.json', json, function(err, result) {
if(err) console.log(err);
});
const oldFile = fs.readFileSync('oldData.json');
const newFile = fs.readFileSync('vatsimData.json');
const oldParsed = JSON.parse(oldFile);
const newParsed = JSON.parse(newFile)
const diff = compareJson.map(oldParsed, newParsed);
const result = {}
for (const {type, data} of Object.values(diff.controllers)) {
if (result[type]) {
result[type].push(data)
} else {
result[type] = [data]
}
}
if (result.created) {
this.emit('newController', result.created)
}
}
async initialUpdate() {
let body = await this.downloadFile();
const parsedJSON = JSON.parse(body);
parsedJSON.updated_date = new Date();
const json = JSON.stringify(parsedJSON);
fs.writeFileSync('vatsimData.json', json, function(err, result) {
if(err) console.log(err);
});
}
downloadFile() {
return new Promise((resolve, reject) => {
const urlList = [
'http://us.data.vatsim.net/vatsim-data.json',
'http://eu.data.vatsim.net/vatsim-data.json',
'http://apac.data.vatsim.net/vatsim-data.json'
];
const url = urlList[Math.floor(Math.random()*urlList.length)];
request(url, (error, response, body) => {
if (error) reject(error);
if (response.statusCode !== 200) {
reject('Invalid status code <' + response.statusCode + '>');
}
resolve(body);
});
});
}
async loadFile(){
await this.shouldUpdate();
return(JSON.parse(fs.readFileSync('vatsimData.json', {encoding:'utf-8'})));
}
}
Возможно ли сделать это еще более эффективным, поскольку я не уверен, что это лучший способ, которым я могу это сделать.