Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Javascript 如何缓存使用fetch in节点的异步函数中的数据_Javascript_Arrays_Json_Object_Memcached - Fatal编程技术网

Javascript 如何缓存使用fetch in节点的异步函数中的数据

Javascript 如何缓存使用fetch in节点的异步函数中的数据,javascript,arrays,json,object,memcached,Javascript,Arrays,Json,Object,Memcached,我试图看看是否有一种方法可以缓存来自fetch异步调用的json响应,可能是使用LRU 我尝试过使用几个包,比如节点缓存和lru缓存,但我认为它们不起作用,因为我的函数是异步的 这就是我的fetch函数的基本外观: const jsonFetch = async (url) => { try { const response = await fetch (url) const json = await response.json();

我试图看看是否有一种方法可以缓存来自fetch异步调用的json响应,可能是使用LRU

我尝试过使用几个包,比如节点缓存和lru缓存,但我认为它们不起作用,因为我的函数是异步的

这就是我的fetch函数的基本外观:

const jsonFetch = async (url) => {
    try {
        const response = await fetch (url)
        const json = await response.json();
        return json
    }
    catch (error) {
        console.log(error)
    }
}

例如,如果我让某人在一分钟内点击我的路线20次,我希望轻松获取数据并在0.03毫秒而不是0.3毫秒内返回响应。目前,它总是使用a URL获取数据。

异步函数不会阻止缓存结果。您正在查看的库可能无法处理这些承诺,但这里有一个基本的概念证明,可能有助于启动工作:

let cache={}
const jsonFetch=async(url)=>{
if(缓存中的url){//如果可用,返回缓存结果
log(“缓存命中”)
返回缓存[url]
}
试一试{
const response=等待获取(url)
const json=response.json();
cache[url]=json//缓存响应已键入url
返回json
}
捕获(错误){
console.log(错误)
}
}
jsonFetch(“https://jsonplaceholder.typicode.com/todos/1)然后((用户)=>console.log(用户id))
//应该被缓存--相同的url
setTimeout(()=>jsonFetch(“https://jsonplaceholder.typicode.com/todos/1)然后((user)=>console.log(user.id)),2000)
//不在缓存中

setTimeout(()=>jsonFetch(“https://jsonplaceholder.typicode.com/todos/2)然后((user)=>console.log(user.id)),2000)
这已经在这里有一段时间了,但我同意@sleepy012的评论。如果我想避免并行调用,技巧应该是缓存承诺,而不仅仅是值。因此,类似这样的方法应该有效:

let cache={}
函数cacheAsync(加载器){
返回异步(url)=>{
if(缓存中的url){//如果可用,返回缓存结果
log(“缓存命中”)
返回缓存[url]
}
试一试{
const responsePromise=加载程序(url)
缓存[url]=响应promise
返回响应预测
}
捕获(错误){
console.log('Error',Error.message)
}
};
}
函数delayedLoader(url){
console.log('加载url:'+url)
返回新承诺((r)=>setTimeout(r,1000,'Returning'+url));
}
const cachedLoader=cacheAsync(delayedLoader);
cachedLoader('url1')。然后((d)=>console.log('First load get:'+d));
cachedLoader('url1')。然后((d)=>console.log('secondload-got:'+d));
cachedLoader('url2')。然后((d)=>console.log('Third load get:'+d));
cachedLoader('url2')。然后((d)=>console.log('third load get:'+d));

log(“等待加载完成”)实际上,此代码不是100%正确的:如果对同一url的第二个请求在第一个请求仍在等待时出现,则将触发第二个获取。根据上下文,这可能是从无害到邪恶的一切。