【问题标题】:How to limit function calls in JS?如何限制 JS 中的函数调用?
【发布时间】:2021-10-03 13:33:58
【问题描述】:

我需要一个函数 limitCalls (fn, maxCalls),它接受一个函数 fn 并返回一个新函数,该函数的调用次数不超过 maxCalls 中指定的次数。测试示例:

 it('limitCalls', () => {
const makeIncrement = () => {
  let count = 0;

  return () => {
    count += 1;
    return count;
  };
};

const limitedIncrementA = limitCalls(makeIncrement(), 3);

expect(limitedIncrementA()).toBe(1);
expect(limitedIncrementA()).toBe(2);
expect(limitedIncrementA()).toBe(3);
expect(limitedIncrementA()).toBe(undefined);
expect(limitedIncrementA()).toBe(undefined);

const limitedIncrementB = limitCalls(makeIncrement(), 1);

expect(limitedIncrementB()).toBe(1);
expect(limitedIncrementB()).toBe(undefined);
expect(limitedIncrementB()).toBe(undefined);

});

我有:

var calls = 0;
export default function limitCalls(fn, maxCalls) {
  if (calls >= maxCalls) {
    return undefined;
  }
  calls += 1;
  return fn();
}

而且错误是有限的IncrementA 不是函数。请帮助我实现它。

【问题讨论】:

    标签: javascript function testing


    【解决方案1】:

    总是返回一个有条件地执行fn回调的函数,而不是有条件地返回一个函数:

    function limitCalls(fn, maxCalls) {
      let count = 0;
      
      return function(...args) {
        return count++ < maxCalls ? fn(...args) : undefined;
      }
    }
    
    const limited = limitCalls(console.log, 3);
    
    limited('one');
    limited('two');
    limited('three');
    limited('four');

    【讨论】:

      【解决方案2】:

      在这个 sn-p 中,limitedIncrementA 确实不是一个函数。看到这个:

      /* You're calling makeIncrement,
         so you're passing its return to 'limitCalls'
       */
      const limitedIncrementA = limitCalls(makeIncrement(), 3);
      
      /* Here, considering that makeIncrement exists,
         you're passing a reference to this functions,
         which can be called inside 'limitCalls'
       */
      const limitedIncrementB = limitCalls(makeIncrement, 3);
      

      所以,假设 makeIncrement 返回 1, 2, 3, ...,您当前的代码相当于:

      limitCalls(1, 3);
      

      【讨论】:

      • 我明白了。但根据任务我无法更改测试代码。有没有办法让limitedIncrementA成为limitCalls中的一个函数?
      • 您可以在不调用(不带括号)的情况下返回您所谓的“fn”,但您也可以使用console.log(makeIncrement()) 检查此代码以查看这是否实际上返回了一个函数
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      相关资源
      最近更新 更多