首页 > 解决方案 > 如何限制 JS 中的函数调用?

问题描述

我需要一个函数 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 不是一个函数。请帮助我实现它。

标签: javascriptfunctiontesting

解决方案


不是有条件地返回一个函数,而是总是返回一个有条件地执行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');


推荐阅读