var request = require("request");
// создаем класс для кэширования результатов запросов
var СacheRequest = function() {
// конструктор
// создаем ассоциативный массив для кэширования результата
this.cache = {};
};
// основной метод класса, предназначен для получения данных по ссылке
// принимает url в качестве параметра
// возвращает выполненный промис если запрос есть в кэше
// или промис в ожидании выполнения запроса
СacheRequest.prototype.get = function(url) {
var self = this;
// если такой запрос уже был, возвращаем промис с результатом из кэша
if( this.cache[url] )
return Promise.resolve(this.cache[url]);
// иначе возвращаем промис с ожиданием результата
return new Promise(function(resolve,reject){
// делаем запрос на указанный url
request(url, function(error, response, body){
// если ошибка - реджектим )
if( error )
return reject(error);
// иначе запоминаем в кэше ответ
self.cache[url] = body;
// и резолвим body
resolve(body);
});
});
};
// метод отчищает кэш
СacheRequest.prototype.clear= function(){
this.cache = {};
};
// создаем экземпляр кэша
var cacheRequest = new СacheRequest();
// так как request асинхронный, то для того, чтобы получить
// результат запроса используем метод .then у возвращаемого промиса
// выполняем запросы:
// запросим "http://google.ru/" (будет сделан фактический запрос)
cacheRequest.get("http://google.ru/")
.then(function(body1){
console.log("\n\n\nBODY:", body1, 111);
//теперь еще раз запросим "http://google.ru/" (будет взято из кэша)
cacheRequest.get("http://google.ru/")
.then(function(body2){
console.log("\n\n\nBODY:", body2, 222);
});
});
// раз в сутки отчищаем кэш
setTimeout( function(){
cacheRequest.clear();
}, 1000*60*60*24 ); // 1000*60*60*24 это количество миллисекунд в сутках
Сам я в СПб всего 3 года (адъюнктура), так что большая часть местного фольклера мне не известна. Это я про "камень с Невы")