JSFiddle - React, Tailwind, and code Playground

by lid0

HTML

interval using timeout for async  using await to block 
<pre>
  (func, ms, immediate = true) => {
  let timeout = null, 
      done    = false;

  const stop = () => {
    if(!done){
      clearTimeout(timeout);
      done = true
    }
  };

  async function body () {
    await func();
    if(!done) {
      timeout = setTimeout(body, ms) 
    }
  }

  if(immediate) { 
    body() 
  } else {
    timeout = setTimeout(body, ms)
  }

  return {stop};
};
</pre>

JavaScript

var doInterval = (func, ms, immediate = true) => {
  let timeout, done;

  const stop = () => {
    if (done) return
    clearTimeout(timeout);
    done = true
  };
  async function body() {
    await func();
    !done ? timeout = setTimeout(body, ms) : null;
  }
  if (immediate) {
    body();
  } else {
    timeout = setTimeout(body, ms);
  }
  return {
    stop
  };
};

let {stop} = doInterval(() => {
  console.log("AAA")
}, 1000, true)

setTimeout(stop, 5000)