diff --git a/README.md b/README.md
index 3d77ed57c..831b363dd 100644
--- a/README.md
+++ b/README.md
@@ -2463,23 +2463,28 @@ anagramsCached('javascript'); // returns virtually instantly since it's now cach
Ensures a function is called only once.
-Utilizing a closure, use a flag, `called`, and set it to `true` once the function is called for the first time, preventing it from being called again.
-Allow the function to be supplied with an arbitrary number of arguments using the spread (`...`) operator.
+Utilizing a closure, use a flag, `called`, and set it to `true` once the function is called for the first time, preventing it from being called again. In order to allow the function to have its `this` context changed (such as in an event listener), the `function` keyword must be used, and the supplied function must have the context applied.
+Allow the function to be supplied with an arbitrary number of arguments using the rest/spread (`...`) operator.
```js
-const once = fn =>
- (called => (...args) => (!called ? ((called = true), fn(...args)) : undefined))();
+const once = fn => {
+ let called = false;
+ return function(...args) {
+ if (called) return;
+ called = true;
+ return fn.apply(this, args);
+ };
+};
```
Examples
```js
-const startApp = event => {
- // initializes the app
- console.log(event); // access to any arguments supplied
+const startApp = function(event) {
+ console.log(this, event); // document.body, MouseEvent
};
-document.addEventListener('click', once(startApp)); // only runs `startApp` once upon click
+document.body.addEventListener('click', once(startApp)); // only runs `startApp` once upon click
```
Ensures a function is called only once.
Utilizing a closure, use a flag, called, and set it to true once the function is called for the first time, preventing it from being called again. Allow the function to be supplied with an arbitrary number of arguments using the spread (...) operator.
const once = fn =>
- (called => (...args) => (!called ? ((called = true), fn(...args)) : undefined))();
-const startApp = event => {
- // initializes the app
- console.log(event); // access to any arguments supplied
+Ensures a function is called only once.
Utilizing a closure, use a flag, called, and set it to true once the function is called for the first time, preventing it from being called again. In order to allow the function to have its this context changed (such as in an event listener), the function keyword must be used, and the supplied function must have the context applied. Allow the function to be supplied with an arbitrary number of arguments using the rest/spread (...) operator.
const once = fn => {
+ let called = false;
+ return function(...args) {
+ if (called) return;
+ called = true;
+ return fn.apply(this, args);
+ };
};
-document.addEventListener('click', once(startApp)); // only runs `startApp` once upon click
+const startApp = function(event) {
+ console.log(this, event); // document.body, MouseEvent
+};
+document.body.addEventListener('click', once(startApp)); // only runs `startApp` once upon click
Runs an array of promises in series.
Use Array.reduce() to create a promise chain, where each promise returns the next promise when resolved.
const runPromisesInSeries = ps => ps.reduce((p, next) => p.then(next), Promise.resolve());
const delay = d => new Promise(r => setTimeout(r, d));
runPromisesInSeries([() => delay(1000), () => delay(2000)]); // //executes each promise sequentially, taking a total of 3 seconds to complete
diff --git a/snippets/once.md b/snippets/once.md
index 0705672a9..92ef9c7be 100644
--- a/snippets/once.md
+++ b/snippets/once.md
@@ -10,8 +10,8 @@ const once = fn => {
let called = false;
return function(...args) {
if (called) return;
- called = true;
- return fn.apply(this, args);
+ called = true;
+ return fn.apply(this, args);
};
};
```