Search code examples
javascriptwhile-loopsettimeoutes6-promise

Calling a function as many times as possible in a given time interval


I am trying to call the function test() as many times as possible in a given time interval.

Here the function should be running for 15 seconds.

function test(): void; // Only type def

function run() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve();
    }, 15000); // 15 seconds
    while (true) {
      test();
    }
  });
}

run()
  .then(() => {
    console.log('Ended');
  });

However, the function doesn't stop running, and the Ended console.log does not appear. (Promise not resolved obviously). Is there a way to achieve this in Javascript ?

I was wondering, I could probably use console timers and put the condition in the while statement ? (But is that the best way ?)


Solution

  • The reason why your function does not stop executing is because resolving a promise does not stop script executing. What you want is to store a flag somewhere in your run() method, so that you can flip the flag once the promise is intended to be resolved.

    See proof-of-concept below: I've shortened the period to 1.5s and added a dummy test() method just for illustration purpose:

    let i = 0;
    function test() {
       console.log(`test: ${i++}`);
    }
    
    function run() {
      return new Promise(resolve => {
        let shouldInvoke = true;
        setTimeout(() => {
          shouldInvoke = false;
          resolve();
        }, 1500); // 15 seconds
        
        const timer = setInterval(() => {
          if (shouldInvoke)
            test();
          else
            window.clearInterval(timer);
        }, 0);
      });
    }
    
    run()
      .then(() => {
        console.log('Ended');
      });