返回节流函数中的最后计算结果

问题描述 投票:0回答:1

我正在做一个基于 下划线 _.throttle 函数的练习。我们的函数略有修改,因为如果

_.throttle
函数仍在等待执行下一个调用,我们将返回最后的计算结果。我已经成功地使油门功能正常工作,但是计算最后的结果对我来说并没有成功。

我尝试过的事情

在油门功能之前我已经研究了记忆功能,我认为将两者结合起来是一个聪明的主意。我尝试了多种不同的方法来实现

_.throttle
函数中的记忆代码,但我的测试一直失败。这是我的两次尝试:

_.throttle = function (func, wait) {
  let throttle = false;
  let cache = {};

  return function (...arguments) {
    const key = JSON.stringify(arguments);
    let result = func.apply(this, arguments);
    cache[key] = result;

    if (!throttle) {
      throttle = true;

      setTimeout(function () {
        throttle = false;
      }, wait);

      return result;
    } else {
      return cache[key];
    }
  };
};
_.throttle = function (func, wait) {
  let throttle = false;
  let cache = {};

  return function (...arguments) {
    const key = JSON.stringify(arguments);

    if (throttle) {
      return cache[key];
    }

    let result = func.apply(this, arguments);
    cache[key] = result;
    throttle = true;

    console.log(cache[key]);


    setTimeout(function () {
      throttle = false;
    }, wait);

    return result;
  };
};

我在寻找什么

基本上,如果

setTimeout
尚未完成,我想返回最后的计算结果。通过
_.throttle
传递的函数会反转通过其参数传递的字符串。我尝试了上述代码的几种变体,以查明
return cache[key]
是否不在错误的位置,从而得到错误的值,但我找不到它工作的位置。我做错了什么?

提前致谢!

javascript underscore.js memoization throttling
1个回答
0
投票

找到了一种无需记忆即可完全完成我想做的事情的方法。结果你只需要先初始化结果,然后保存结果。这是我如何通过测试的代码:

_.throttle = function (func, wait) {
  let throttle = false;
  let result;

  return function (...arguments) {
    if (throttle) {
      return result;
    }

    result = func.apply(this, arguments);
    throttle = true;

    setTimeout(function () {
      throttle = false;
    }, wait);

    return result;
  };
};

上面的程序返回一个受限制的函数。当有很多后续调用时,调用将仅返回最后的计算结果!这可以优化程序的速度。

© www.soinside.com 2019 - 2024. All rights reserved.