Установка и использование единого глобального setTimeout? - PullRequest
0 голосов
/ 01 октября 2018

Просто наткнулся на комментарий в этом очень старом вопросе относительно очистки всех setTimeouts.

Комментарий заинтриговал меня, так как фактически не затрагивает вопрос напрямую, но предлагает действительноИнтересное альтернативное решение проблемы слежения за несколькими таймерами, но, к сожалению, он не приводит пример того, как это можно реализовать:

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

... Я просто имел в виду, что у вас один глобальный таймаут запускается каждые 50 мс.Любая другая функция, которая потребовала бы элемент синхронизации, затем извлекала бы его из глобального тайм-аута.Google переключился на это для эффективности, хотя я больше не могу найти статью, цитирующую это.

Как можно было бы установить, как я полагаю, именованный таймер в глобальном пространстве, а затем сослаться на него в другом месте внесколько случаев?

Например, если бы у нас было что-то подобное в глобальном пространстве:

let myGlobalTimer = setTimeout(function(){ myFunc(); }, 50);

Это будет работать только myFunc каждые 50 мс.

Я почти уверен, что вы не можете передавать имена динамических функций в setTimeout, так как же этого добиться?

1 Ответ

0 голосов
/ 01 октября 2018

Вы можете запустить тайм-аут через массив или Set функций каждый раз, когда тайм-аут срабатывает.Чтобы добавить функцию, которая запускается при каждой итерации, добавьте ее в Set;чтобы остановить его, удалите его из Set.Например:

const fns = new Set();
function runAllTasks() {
  for (const fn of fns) {
    fn();
  }
  // Run every 500 ms:
  setTimeout(runAllTasks, 500);
}

fns.add(() => console.log('fn one running'));
const fn2 = () => console.log('fn two running');
fns.add(fn2);
runAllTasks();

// example, remove fn2 from the Set after 1300ms:
setTimeout(() => {
  fns.delete(fn2);
}, 1300);

Конечно, вы также можете использовать массив, но Set более подходит, когда порядок элементов в коллекции невопрос.

...