Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save blackrabbit99/e0d3aa1b34e93198280b to your computer and use it in GitHub Desktop.
Save blackrabbit99/e0d3aa1b34e93198280b to your computer and use it in GitHub Desktop.
function MakeQuerablePromise(promise) {
// Don't create a wrapper for promises that can already be queried.
if (promise.isResolved) return promise;
var isResolved = false;
var isRejected = false;
// Observe the promise, saving the fulfillment in a closure scope.
var result = promise.then(
function(v) { isResolved = true; return v; },
function(e) { isRejected = true; throw e; });
result.isFulfilled = function() { return isResolved || isRejected; };
result.isResolved = function() { return isResolved; }
result.isRejected = function() { return isRejected; }
return result;
}
var functions = [
function() {
console.log('start 1');
return new Promise((res, rej) => { setTimeout((undefined) => { console.log('finish 1'); res() }, 1000, 1) });
},
function(){
console.log('start 2');
return new Promise((res, rej) => { setTimeout((undefined) => { console.log('finish 2'); res() }, 2000, 2) });
},
function(){
console.log('start 3');
return new Promise((res, rej) => { setTimeout((undefined) => { console.log('finish 3'); res() }, 3000, 3) });
},
function(){
console.log('start 4');
return new Promise((res, rej) => { setTimeout((undefined) => { console.log('finish 4'); res() }, 4000, 4) });
},
function(){
console.log('start 5');
return new Promise((res, rej) => { setTimeout((undefined) => { console.log('finish 5'); res() }, 5000, 5) });
},
function(){
console.log('start 6');
return new Promise((res, rej) => { setTimeout((undefined) => { console.log('finish 6'); res() }, 6000, 6) });
},
];
var startStack = functions.splice(0,2).map((fn) => MakeQuerablePromise(fn()) );
functions.reduce(function(promise, fn) {
return promise.then(function() {
startStack = startStack.filter((i) => !i.isFulfilled())
startStack.push(MakeQuerablePromise(fn()));
return Promise.race(startStack);
});
}, Promise.race(startStack));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment