用文字记录生活,留下美好瞬间
原创

只允许一次函数调用

共 1,338 字,需阅读 3 分钟
2018/10/26 上午
259 次阅读

#JavaScript 函数防多次调用包装器

#问题描述

实现一个名为 once 的高阶函数,接受一个参数 fn,该参数是一个任意参数和返回值类型的函数。once 函数应返回一个新的函数,新函数在首次调用时执行并返回 fn 的结果,之后的所有调用均返回 undefined

#示例

#示例 1

          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
输入: fn = (a, b, c) => (a + b + c), calls = [[1, 2, 3], [2, 3, 6]] 输出: [{"calls": 1, "value": 6}] 解释: ```typescript const onceFn = once(fn); onceFn(1, 2, 3); // 返回 6 onceFn(2, 3, 6); // 返回 undefined,fn 没有被调用

#示例 2

          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
输入: fn = (a, b, c) => (a * b * c), calls = [[5, 7, 4], [2, 3, 6], [4, 6, 8]] 输出: [{"calls": 1, "value": 140}] 解释: ```typescript const onceFn = once(fn); onceFn(5, 7, 4); // 返回 140 onceFn(2, 3, 6); // 返回 undefined,fn 没有被调用 onceFn(4, 6, 8); // 返回 undefined,fn 没有被调用

#约束条件

  • 1 <= calls.length <= 10
  • 1 <= calls[i].length <= 100
  • 2 <= JSON.stringify(calls).length <= 1000

#解决方案

          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
function once<T extends (...args: any[]) => any>(fn: T): ((...args: Parameters<T>) => ReturnType<T> | undefined) { let flag = false; return function (...args: Parameters<T>): ReturnType<T> | undefined { return flag ? undefined : ((flag = true), fn(...args)); }; } /** * 示例用法: * let fn = (a, b, c) => (a + b + c) * let onceFn = once(fn) * * onceFn(1, 2, 3); // 返回 6 * onceFn(2, 3, 6); // 返回 undefined,fn 不会被再次调用 */
自由转载 - 署名 - 非商业性使用
https://zhangwurui.cn/article/30
0/0条看法
访客身份
在下有一拙见,不知...
期待你的捷足先登