JSFiddle - React, Tailwind, and code Playground

by Rolf

JavaScript

console.clear();
console.log("Start");
let startTime = Date.now();
async function delay(millisecs) {
   console.log("Wait " + millisecs + "ms");
   return new Promise((res,rej) => setTimeout(res, millisecs));
}

async function* tickSequence(start, end) {
  let counter = start;
  let numbers = [];
  let resolver = null;
  let interval = setInterval(handleTick, 500);
  function handleTick() {
     console.log("                           tick after " + (Date.now() - startTime));
     numbers.push(counter);
     if (counter >= end) clearInterval(interval);
     if (resolver) resolver(counter);
     counter++;
  }
  
  while (interval >= 0) {
     if (numbers.length == 0)
     {
        await new Promise((resolve, reject) => {
           resolver = resolve;
        });
     }
     console.log(numbers.length + " nums in cache");
     yield numbers.shift();
  }
}

async function readSequence(sequence) {
   for await (let seq of sequence) {
      console.log((Date.now() - startTime) + " - Seq: " + seq);
      await delay(300 + 400*Math.random());
      console.log("go on");
   }
}

const sequence = tickSequence(1, 15);
readSequence(sequence);