zoukankan      html  css  js  c++  java
  • 异步缓存cacheCall

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

     //异步缓存
     var cacheCall=function (fn, interval) {
         var caches = [],cacheToken;
         setInterval(function () {
             lib._.remove(caches, function (cache) {
                 return !cache.pending && new Date() - cache.time > interval;
             });
         }, 60 * 1000);
         return function (arg, cb) {
             var getCache = function () {
                 return lib._.find(caches, function (cache) {
                     return lib._.isEqual(cache.arg, arg);
                 });
             }
             var done = function (res) {
                 var cache = getCache();
                 lib._.assign(cache, { value: res, time: new Date(), pending: false });
                 lib._.remove(cache.list).forEach(function (cb) { cb(res); });
             }
             var cache = getCache();
             if (cache) {
                 cache.pending ? cache.list.push(cb) : cb(cache.value);
             } else {
                 caches.push({arg:arg, pending: true, list: [cb] });
                 fn(arg,done);
             }
         }
     },

    测试

         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

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

    注:lib._为lodash库

  • 相关阅读:
    A Bayesian Approach to Deep Neural Network Adaptation with Applications to Robust Automatic Speech Recognition
    nnet3的代码分析
    Kaldi中的L2正则化
    HMM拓扑与转移模型
    Kaldi阅读并更改代码
    nnet3中的数据类型
    nnet3配置中的“编译”
    Kaldi的delta特征
    Kaldi的交叉熵正则化
    【搜索】 Prime Path
  • 原文地址:https://www.cnblogs.com/zhuxianguo/p/7058233.html
Copyright © 2011-2022 走看看