Last active
July 5, 2017 19:28
-
-
Save lexjacobs/2c4bdb5f7a760c2774a8047d02f33c5c to your computer and use it in GitHub Desktop.
async queuing system that will retry failures
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
// 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