Skip to content

Instantly share code, notes, and snippets.

@ernestlv
Last active July 3, 2023 18:58
Show Gist options
  • Save ernestlv/942d7eafc5f143dfabfea98edbb019f3 to your computer and use it in GitHub Desktop.
Save ernestlv/942d7eafc5f143dfabfea98edbb019f3 to your computer and use it in GitHub Desktop.
A javascript promise generator that queues tasks
/*
* 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