Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
- const createAsyncQueue = delay => {
- /** @type {{ func: () => PromiseLike, id: number }[]} */
- const queue = []
- let id = 0
- const results = {}; // semi colon needed
- setInterval(async () => {
- if (queue.length > 0) {
- const [ { func, id } ] = queue.splice(0, 1)
- results[id] = await func()
- }
- }, delay)
- return {
- /**
- * Evaluate a delayed function
- * @param {() => PromiseLike} func
- */
- async eval(func) {
- let curId = id++
- queue.push({ func, id: curId })
- await sleep(delay * queue.length) // Wait for the queue to deflate
- const result = results[curId]
- if (!result)
- throw new Error('No result')
- return result
- }
- }
- }
Add Comment
Please, Sign In to add comment