Вызов функции столько раз, сколько возможно за данный интервал времени - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь вызвать функцию test() столько раз, сколько возможно за данный промежуток времени.

Здесь функция должна работать в течение 15 секунд.

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');
  });

Однако функция не останавливается и Ended console.log не отображается. (Обещание не решено, очевидно). Есть ли способ достичь этого в Javascript?

Мне было интересно, я мог бы, вероятно, использовать консольные таймеры и поместить условие в оператор while? (Но так ли это лучше?)

1 Ответ

1 голос
/ 06 января 2020

Причина, по которой ваша функция не прекращает выполнение, заключается в том, что разрешение обещания не останавливает выполнение скрипта. Вам нужно хранить флаг где-нибудь в вашем методе run(), чтобы вы могли перевернуть флаг, как только обещание будет решено.

См. Подтверждение концепции ниже: Я сократил период до 1,5 с и добавил фиктивный test() метод только для иллюстрации:

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');
  });
...