首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用_.memoize()和_.debounce()

使用_.memoize()和_.debounce()
EN

Stack Overflow用户
提问于 2013-12-23 15:30:55
回答 2查看 2.4K关注 0票数 3

我想取消对特定页面的每个调用的呈现函数--呈现不同的页面将分别退出。回忆录功能应该能起作用,但它不能正常工作。

代码语言:javascript
复制
var renderPage_underscore = function(pageNo){
  var debouncer = _.memoize(
    // memoize function
    _.debounce(
      // debounced function
      function () {
        // Do renderPage() work here
        document.getElementById("underscore").innerHTML += 
            '<br />' + pageNo + '@' +   new Date().getTime();
      },
      1000, // delay
      true
    ),
    // memoize hash function
    function (pageNo) {
        return pageNo;
    }
  );
  return debouncer(pageNo);
}; 

有什么主意吗?http://jsfiddle.net/Zq8Wd/1/

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-23 15:59:43

以这种方式使用_.memoize()的问题在于它缓存返回值,而不是副作用。如果您想要使用_.memoize()来解决这个问题,您可能需要这样做:

代码语言:javascript
复制
rp = _.memoize(function (pageNo) {
    return _.debounce(function () {
        document.getElementById("underscore").innerHTML +=
            '<br />' + pageNo + '@' + new Date().getTime();
    }, 1000, true);
});

rp(1)();
rp(2)();

更新的JSFiddle

票数 5
EN

Stack Overflow用户

发布于 2017-01-06 20:58:47

我刚想到这个:

代码语言:javascript
复制
/**
 * Memoizes and debounces a function. i.e., returns a new function, that when invoked,
 * returns a Promise that will resolve after `delay` ms unless invoked repeatedly,
 * in which case the last promise will be rejected and the delay will be reset. If the 
 * result has already been computed, will resolve instantly.
 * 
 * @param {Function} func Function to memoize+debounce
 * @param {Number} delay Delay in milliseconds
 * @param {Function} serialize Function used to resolve the cache key
 * @return {Function} Memoized+debounced function.
 */
function membounce(func, delay=333, serialize = x => x) {
    let cache = new Map();
    let timer, cancel, lastKey;
    return (...args) => {
        let key = serialize.call(func, ...args);
        if(timer) {
            clearTimeout(timer);
            cancel(new Error('Debounced'));
            cache.delete(lastKey);
        }
        if(cache.has(key)) {
            return cache.get(key);
        }
        let promise = new Promise((resolve,reject) => {
            cancel = reject;
            timer = setTimeout(() => {
                let result = func(...args);
                resolve(result);
                timer = null;
            }, delay);
        });
        cache.set(key, promise);
        lastKey = key;
        return promise;
    };
}

它总是返回一个Promise,这样您就可以等待它的解决,而忽略任何拒绝,这意味着该值被取消/不计算。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20746529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档