Skip to content

Instantly share code, notes, and snippets.

@lexjacobs
Last active July 5, 2017 19:28
Show Gist options
  • Save lexjacobs/2c4bdb5f7a760c2774a8047d02f33c5c to your computer and use it in GitHub Desktop.
Save lexjacobs/2c4bdb5f7a760c2774a8047d02f33c5c to your computer and use it in GitHub Desktop.
async queuing system that will retry failures
// 50% success rate for each task
function unstableTask() {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() < 0.5) {
resolve('task succeeded!');
} else {
reject('task failed!')
}
}, 200);
});
}
// set a global queue of unstable tasks
const tasks = [];
for (var i = 0; i < 5; i++) {
tasks.push({
task: unstableTask,
number: i
})
}
// async task retrieval, as in reading from database
function getTask() {
return new Promise((resolve, reject) => {
setTimeout(function () {
resolve(tasks[0]);
}, 500);
});
}
// async task removal, as in updating database
function removeTask() {
return new Promise((resolve, reject) => {
setTimeout(function () {
tasks.shift();
resolve('done');
}, 500);
});
}
async function taskRunner() {
while (tasks.length) {
try {
var taskObject = await getTask();
var specificTask = await taskObject.task();
console.log('yay', specificTask, taskObject.number);
var removingTaskResult = await removeTask();
console.log('removingTaskResult: ', removingTaskResult);
} catch (err) {
console.log('error, trying again', err, taskObject.number);
}
}
}
taskRunner();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment