1 minute read

Given a function fn, return a new function that is identical to the original function except that it ensures fn is called at most once.

The first time the returned function is called, it should return the same result as fn. Every subsequent time it is called, it should return undefined.

Example 1:

Input: fn = (a,b,c) => (a + b + c), calls = [[1,2,3],[2,3,6]] Output: [{“calls”:1,”value”:6}] Explanation: const onceFn = once(fn); onceFn(1, 2, 3); // 6 onceFn(2, 3, 6); // undefined, fn was not called Example 2:

Input: fn = (a,b,c) => (a _ b _ c), calls = [[5,7,4],[2,3,6],[4,6,8]] Output: [{“calls”:1,”value”:140}] Explanation: const onceFn = once(fn); onceFn(5, 7, 4); // 140 onceFn(2, 3, 6); // undefined, fn was not called onceFn(4, 6, 8); // undefined, fn was not called

/**
 * @param {Function} fn
 * @return {Function}
 */
var once = (fn) => {
  let called = false;

  return function (...args) {
    if (!called) {
      called = true;
      return fn(...args);
    } else {
      return undefined;
    }
  };
};

/**
 * let fn = (a,b,c) => (a + b + c)
 * let onceFn = once(fn)
 *
 * onceFn(1,2,3); // 6
 * onceFn(2,3,6); // returns undefined without calling fn
 */

The once function takes the original function (fn) as a parameter. It initializes a called variable as false to keep track of whether the function has been called before. The once function returns a new function that accepts any number of arguments using the rest parameter syntax (...args). Inside the new function, it checks if called is false. If it is, it means the function hasn’t been called before, so it sets called to true and calls the original function (fn(...args)) with the provided arguments. After calling the original function, it returns the result. If called is true, it means the function has been called before, so it returns undefined.

Leave a comment