Skip to content

Instantly share code, notes, and snippets.

@rainder
Last active November 22, 2017 16:50
Show Gist options
  • Save rainder/d02d52cb1eeda67aa6cf to your computer and use it in GitHub Desktop.
Save rainder/d02d52cb1eeda67aa6cf to your computer and use it in GitHub Desktop.
'use strict';
function DeferredFnStack(fn) {
let stack = Promise.resolve();
return (...args) => {
const dfd = defer();
stack = stack
.catch(() => null)
.then(() => fn(...args).then(dfd.resolve, dfd.reject));
return dfd.promise;
};
/**
*
* @returns {{}}
*/
function defer() {
const dfd = {};
dfd.promise = new Promise((resolve, reject) => {
dfd.resolve = resolve;
dfd.reject = reject;
});
return dfd;
}
}
/**
* USAGE
*/
const fn = DeferredFnStack(() => {
return new Promise((resolve) => {
setTimeout(() => resolve('hi'), 1000);
});
});
fn().then((value) => console.log(value));
fn().then((value) => console.log(value));
fn().then((value) => console.log(value));
/*
Outputs 3 times 'Hello World!' with 1000ms interval
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment