Как создать повторно используемый метод кэширования при использовании node-cache - PullRequest
1 голос
/ 06 января 2020

Я использую node-cache в моем Node.JS & Express веб-сервисе. Но через некоторое время у меня возникла куча похожих логи, таких как:

let data = this.cache.get('some-key')
if (data) {
    return shopInfo
} else {
    data = someModel.find(id)
    this.cache.set('some-key', data)
    return data
}

Я погуглил об этом и нашел возможное решение здесь . Но я не хочу каждый раз передавать функцию обратного вызова. Есть ли способ лучше? Или как я могу изменить его для использования асинхронного / ожидающего вместо функции обратного вызова?

get(key, storeFunction) {
    const value = this.cache.get(key);
    if (value) {
      return Promise.resolve(value);
    }

    return storeFunction().then((result) => {
      this.cache.set(key, result);
      return result;
    });
}

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Если вы не хотите проходить обратный вызов каждый раз, вы можете сделать наоборот - изменить сам обратный вызов.

// simple memoized...
function memoized(cache, fn) {
  return async key => cache.has(key) ? cache.get(key) : cache.set(key, await fn(key)).get(key);      
}

   // some model handler...
function fetchFunction(key) {
  console.log('call fetchFunction');
  return Promise.resolve(key + '_value');
}

   // modify callback...
   // example: model.fetchFunction =  memoized(new Map(), model.fetchFunction).bind(model);
fetchFunction = memoized(new Map(), fetchFunction);

// test...
(async () => {
  console.log(await fetchFunction('test'));
  console.log(await fetchFunction('test'));
})()
0 голосов
/ 09 января 2020

Вам понадобится обратный вызов или обещание в качестве параметра. Вот, возможно, более простой способ:

Вспомогательная функция:

get(key, retrieveData) {
    const value = this.cache.get(key);
    if (value) {
      return value;
    }

    const data = retrieveData()
    this.cache.set(key, data);
    return data;
}

Затем вы можете использовать:

const result = get('some-key', () => someModel.find(id))
return result

Несмотря на использование обратного вызова, он все еще чистый. Не нужно усложнять ваш код обещаниями, если они вам не нужны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...