异步缓存-cacheCall

1,312 阅读1分钟

缓存是提高性能的一个法宝,在异步的世界里也需要有缓存,因此我写了一个异步缓存的闭包函数,此函数的功能为在指定的时间interval内如果参数相同只执行一次http请求,如果在interval内发生并发,则缓存并发请求等待请求返回后一并处理

 //异步缓存
const cacheCall = (fn, interval)=> {
    const caches = {}
    setInterval(()=> {
      Object.keys(caches).forEach(key=>{
        if(cache && !cache.pending && new Date() - cache.time > interval)delete caches[key]
      })
    }, 60 * 1000)
    return (arg, done,fail)=> {
      const key=JSON.stringify(arg)
      const doneFn = (res)=> {
        const cache = caches[key]
        cache.doneList.forEach(cb=>cb&&cb(res))
        Object.assign(cache,{value:res,time: new Date(),pending: false})
      }
      const failfn=(res)=>{
        const cache = caches[key]
        cache.failList.forEach(cb=>cb&&cb(res))
        delete caches[key]
      }
      const cache = caches[key]
      if (cache) {
        cache.pending ? (cache.doneList.push(done),cache.failList.push(fail)) : doneFn(cache.value)
      } else {
        caches[key]={ arg, pending: true, doneList: [done],failList:[fail] }
        fn(arg,doneFn,failfn)
      }
    }
}

 var f = cacheCall(function (args, cb) { console.log(args); cb(args); }, 1000 * 60);
 f('1', function () { console.log('a') });
 f('1', function () { console.log('a') });
 f('2', function () { console.log('b') });

输出:

1
a
a
2
b

可以看到对于相同的参数调用只输出了一次