Last active
July 3, 2023 18:58
-
-
Save ernestlv/942d7eafc5f143dfabfea98edbb019f3 to your computer and use it in GitHub Desktop.
A javascript promise generator that queues tasks
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* A promise generator that queues tasks | |
*/ | |
function initTaskGenerator() { | |
function yieldPromise(task) { // executed in yield expression | |
return new Promise((resolve, reject) => { | |
try { | |
setTimeout(() => { | |
var value = typeof task === "function" ? task() : task; | |
resolve(value); | |
}, 0); | |
} catch (error) { | |
reject(error); | |
} | |
}); // iterator value | |
} | |
function* iteratorFn(task) { // body does not execute until first iterator.next() is called | |
task = yield Promise.resolve(); // stops execution | |
while(task) { | |
task = yield yieldPromise(task); // stop execution | |
} | |
return Promise.resolve(); // terminates execution | |
} | |
var iterator = iteratorFn(); // creates iterator object | |
iterator.next(); // executes iteratorFn body | |
return (task) => { | |
var iteratorValue = iterator.next(task); // executes iteratorFn body | |
var taskPromise = iteratorValue.value; | |
return taskPromise; | |
}; | |
} | |
var generateTask = initTaskGenerator(); // init generator | |
var taskA = generateTask(() => { throw "Task A Failed" }); // creates a promise with error | |
var taskB = generateTask(() => "Task B Completed"); // creates a promise | |
var taskC = generateTask([1,2,3,4,5]); | |
generateTask(); // terminates generator | |
taskA.then((value) => { | |
console.log(value); | |
}); | |
taskB.then((value) => { | |
console.log(value); | |
}); | |
taskC.then((value) => { | |
console.log(value); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment