Guest User

Untitled

a guest
May 27th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.76 KB | None | 0 0
  1. const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
  2.  
  3. const createAsyncQueue = delay => {
  4. /** @type {{ func: () => PromiseLike, id: number }[]} */
  5. const queue = []
  6. let id = 0
  7. const results = {}; // semi colon needed
  8.  
  9. setInterval(async () => {
  10. if (queue.length > 0) {
  11. const [ { func, id } ] = queue.splice(0, 1)
  12. results[id] = await func()
  13. }
  14. }, delay)
  15.  
  16. return {
  17. /**
  18. * Evaluate a delayed function
  19. * @param {() => PromiseLike} func
  20. */
  21. async eval(func) {
  22. let curId = id++
  23. queue.push({ func, id: curId })
  24. await sleep(delay * queue.length) // Wait for the queue to deflate
  25. const result = results[curId]
  26. if (!result)
  27. throw new Error('No result')
  28. return result
  29. }
  30. }
  31. }
Add Comment
Please, Sign In to add comment