I need to write a function that accepts callback as an input and returns a function.

  • A+
Category:Languages

I want to write a function once that accepts a callback as input and returns a function. When the returned function is called the first time, it should call the callback and return that output. If it is called any additional times, instead of calling the callback again it will simply return the output value from the first time it was called.

Below is what I have tried to do. But I am not getting the results as I expected. I need to understand this concept.

function once(func) {   let num;    function retFunc(x){       num = func(x);        return num;  }     return retFunc; }  function addByTwo(input){   return input + 2; }  var onceFunc = once(addByTwo);  console.log(onceFunc(4));  //should log 6 console.log(onceFunc(10));  //should log 6 console.log(onceFunc(9001));  //should log 6 

 


You should only assign num = func(x) when num is undefined - that is, on the very first call of retFunc:

function once(func) {   let num;    function retFunc(x){     if (num === undefined) {       num = func(x);     }     return num;   }   return retFunc; }  function addByTwo(input){   return input + 2; }  var onceFunc = once(addByTwo);  console.log(onceFunc(4));  //should log 6 console.log(onceFunc(10));  //should log 6 console.log(onceFunc(9001));  //should log 6

But this isn't a guaranteed general solution - what if the passed function (addByTwo in your example) results in undefined when called? Then, the === undefined check won't work. So, it might be better to set a flag or something similar, and reassign that flag the first time the callback is called:

function once(func) {   let num;   let done = false;   function retFunc(x){     if (!done) {       done = true;       num = func(x);     }     return num;   }   return retFunc; }  function returnsUndefinedOn1(input){   return input === 1 ? undefined : input; }  var onceFunc = once(returnsUndefinedOn1);  console.log(onceFunc(1)); console.log(onceFunc(10)); console.log(onceFunc(9001));

Comment

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: