Node.js 如何在使用节点缓存时创建可重用的缓存方法
我正在node.JS和Express web服务上使用Node.js 如何在使用节点缓存时创建可重用的缓存方法,node.js,caching,Node.js,Caching,我正在node.JS和Express web服务上使用节点缓存。但过了一段时间,我有一堆类似的逻辑杂乱无章,如下所示: let data = this.cache.get('some-key') if (data) { return shopInfo } else { data = someModel.find(id) this.cache.set('some-key', data) return data } 我在谷歌上搜索了一下,找到了一个可能的解决办法。但
节点缓存
。但过了一段时间,我有一堆类似的逻辑杂乱无章,如下所示:
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;
});
}
您需要回调或承诺作为参数。这里可能有一个更简单的方法: 辅助功能:
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
尽管使用了回调,它仍然是干净的。如果不需要承诺,则无需使用承诺使代码复杂化。您需要回调或承诺作为参数。这里可能有一个更简单的方法: 辅助功能:
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
尽管使用了回调,它仍然是干净的。如果您不需要承诺,则无需使用承诺使代码复杂化。如果您不想每次都通过回调,则可以执行相反的操作—修改回调本身
//简单的记忆。。。
已记忆的函数(缓存,fn){
return async key=>cache.has(key)?cache.get(key):cache.set(key,wait-fn(key)).get(key);
}
//一些模型处理程序。。。
函数获取函数(键){
log('callfetchfunction');
返回承诺。解析(键+“_值”);
}
//修改回调。。。
//示例:model.fetchFunction=memorized(newmap(),model.fetchFunction).bind(model);
fetchFunction=memorized(新映射(),fetchFunction);
//测试。。。
(异步()=>{
log(wait fetchFunction('test');
log(wait fetchFunction('test');
})()
如果您不想每次都通过回调,可以执行相反的操作-修改回调本身
//简单的记忆。。。
已记忆的函数(缓存,fn){
return async key=>cache.has(key)?cache.get(key):cache.set(key,wait-fn(key)).get(key);
}
//一些模型处理程序。。。
函数获取函数(键){
log('callfetchfunction');
返回承诺。解析(键+“_值”);
}
//修改回调。。。
//示例:model.fetchFunction=memorized(newmap(),model.fetchFunction).bind(model);
fetchFunction=memorized(新映射(),fetchFunction);
//测试。。。
(异步()=>{
log(wait fetchFunction('test');
log(wait fetchFunction('test');
})()
someModel、'some-key'
和id
是否在该逻辑的不同示例中都发生了更改?'some-key'
是否与id
相同、相关或完全独立?如果尚未缓存数据,是否始终需要对模型调用find(id)
?从你的问题中很难看出你真正需要什么。如果答案是“不”,你会接受吗?我可以详细说明您的选项,但基本上一个简单的参数化不能不传递参数。您可以切换到async/await,但没有回调,仍然会出现混乱。在该逻辑的不同示例中,someModel
、'some-key'
和id
是否都发生了更改?'some-key'
是否与id
相同、相关或完全独立?如果尚未缓存数据,是否始终需要对模型调用find(id)
?从你的问题中很难看出你真正需要什么。如果答案是“不”,你会接受吗?我可以详细说明您的选项,但基本上一个简单的参数化不能不传递参数。您可以切换到async/await,但如果没有回调,则仍然会出现混乱。