javascript - 如何限制 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 不是一个函数。请帮助我实现它。
解决方案
不是有条件地返回一个函数,而是总是返回一个有条件地执行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');
推荐阅读
- python - 如何使用公式从 Excel 单元格中获取值?Openpyxl data_Only 标志无法正常工作
- c# - 为什么我的 gridview 不显示页脚行?vb.net
- php - 仅当满足条件时才登录用户 - Laravel
- python - 删除不以/不包含特定单词开头的行
- java - 使用 Spring Integration 的 Java 邮件侦听器:多个应用程序实例未收到邮件
- reactjs - 谷歌云存储桶上的反应托管没有这样的关键错误
- python - 此字符串替换 lambda 组函数如何工作的说明或文档
- android - Kotlin 协程从 SharedPreferences 流出并使用 GlobalScope 与 MainScope 观察存储库中的数据流
- db2 - 我需要屏蔽才能仅查看最后 4 位数字
- amazon-web-services - AWS CDK - 如何在部署之前将 Lambda 的调用权限授予 API Gateway?