Это цель, которой служит памятка .Поскольку getEventsOptions
принимает скалярные аргументы, это упрощает способ его запоминания;Ключ кэша может быть вычислен из строковых аргументов, например, с помощью Lodash memoize
или аналогичной реализации:
function memoize(fn, getCacheKey = ([firstArg]) => firstArg) {
const cache = new Map();
return (...args) => {
const cacheKey = getCacheKey(args);
if (!cache.has(cacheKey))
cache.set(cacheKey, fn(...args));
return cache.get(cacheKey);
}
}
Предпочтительно использовать обещания, поскольку в результате объект обещания может быть кэширован, аэто будет трудно сделать с помощью обратного вызова API.Обещания предоставляются для request
с официальным пакетом request-promise
:
const request = require('request-promise');
function getEvents(sportId, federationId, date, locale)
{
const options = {
url: `http://myapi.com/sporting-event/sport/${sportId}/date-from/${date}`,
headers: {
'accept': 'application/json',
'dateTo': date,
'federationIds': federationId,
'X-Application-ID': 'sportytrader',
'Accept-Language': locale,
};
return request(options);
};
const getCachedEvents = memoize(
getEvents,
(...args) => JSON.stringify(args)
);
...
getCachedEvents(sportId, federationId, date, locale))
.then(body => res.send(body)
.catch(next);
Обратите внимание, что из-за того, как работает JSON.stringify
, это может повлиять на то, как кешируются запросы, например, аргументы undefined
и null
не различается.