How to write a function that returns a callback, but only the result of the first time calling the callback.
Returns a function that is restricted to invoking func once. Repeat calls to the function return the value of the first call.
function once(func) {
let result = func
let counter = 0
//let result
function inner (n) {
counter++
if (counter = 1) {
return func
}
if (counter > 1) {
return result
}
}
return inner
}
I can't put my finger on what I'm doing wrong.
You're on the right track using the closure, you just have to
Call func at least once (right now you just refer to it; more here)
Remember the result of that for subsequent invocations
You don't need a counter, just some kind of flag; perhaps func itself, which you could clear:
function once(func) {
let result;
return () => {
if (func) {
result = func();
func = null;
}
return result;
};
}
function once(func) {
let result;
return () => {
if (func) {
result = func();
func = null;
}
return result;
};
}
const fn = () => {
console.log("fn called");
return 42;
};
console.log("Getting the function");
const f = once(fn);
console.log("Doing first call");
console.log(f());
// => fn called
// => 42
console.log("Doing second call");
console.log(f()); // 42
// => 42
console.log("Doing third call");
console.log(f()); // 42
// => 42