Я изучил кодовую базу Blink, чтобы ответить на этот вопрос о максимально возможном количестве таймеров в JavaScript.
Новые таймеры создаются с помощью DOMTimerCoordinator::InstallNewTimeout()
. Он вызывает NextID()
< /a> для получения доступного целочисленного ключа. Затем он вставляет новый таймер и соответствующий ключ в timers_
.
int timeout_id = NextID();
timers_.insert(timeout_id, DOMTimer::Create(context, action, timeout,
single_shot, timeout_id));
NextID()
получает следующий идентификатор в циклической последовательности от 1 до 231-1:
int DOMTimerCoordinator::NextID() {
while (true) {
++circular_sequential_id_;
if (circular_sequential_id_ <= 0)
circular_sequential_id_ = 1;
if (!timers_.Contains(circular_sequential_id_))
return circular_sequential_id_;
}
}
Что произойдет, если используются все идентификаторы?
Что мешает NextID()
войти в бесконечный цикл?
Весь процесс более подробно объясняется в моем ответе на этот вопрос.
NextID()
не будет блокироваться - он будет блокироваться, поскольку он будет бесконечно вращаться, и никакой другой код для запуска таймера не может быть выполнен (не в этом потоке). Когда я писал блокировку, я имел в виду многопоточность, но я не эксперт JS. - person Scheff's Cat   schedule 03.11.2018setInterval()
, потому что список является общим для обоих. В этом случае они будут существовать до тех пор, пока пользователь не очистит их. - person David   schedule 07.11.2018