Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在使用节点缓存时创建可重用的缓存方法_Node.js_Caching - Fatal编程技术网

Node.js 如何在使用节点缓存时创建可重用的缓存方法

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 } 我在谷歌上搜索了一下,找到了一个可能的解决办法。但

我正在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
}
我在谷歌上搜索了一下,找到了一个可能的解决办法。但我不想每次都传递回调函数。有更好的办法吗?或者我如何修改它以利用异步/等待而不是回调函数

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,但如果没有回调,则仍然会出现混乱。