У меня есть ситуация, когда несколько вызовов setTimeout() (типичная длина: от 100 мс до 1 с) активны и должны были уйти, но они не срабатывают. Профиль отладки Chrome (Mac) показывает «простоя» во время этого (потенциально бесконечного) периода. Профиль показывает, что ничего не происходит. Нет циклов. Не работает код. Никакой сборки мусора. Никакой активности вообще. Видовой экран активен и имеет фокус. После того, как я буду ждать (возможно, бесконечное время), когда я «делаю что-то еще», например, наведение на какой-то неродственный элемент - так же просто, как: hover - ломающиеся перерывы и очередь в очереди setTimeout().Застрял setTimeout() s (Chrome)
Когда я устанавливаю точки останова в функциях обработчика setTimeout() после этого «замораживания», они попадают в последовательность, когда ломаная ломается, как и следовало ожидать.
К сожалению, путь репликации затруднен. Пока что создание более простых тестовых примеров просто делает репликацию еще более сложной или, в конечном счете, невозможной.
Большая часть болтовни вокруг setTimeout() «проблемы» - это люди, которые не понимают однопоточность jscript и т. Д., Поэтому это не помогает. Позвольте мне повторить: таймеры поставлены в очередь и должны были выстрелить. Браузер простаивает, как доказал профайлер. Таймеры ДОЛЖНЫ стрелять в конечном счете, но только после активности мыши. Такое поведение кажется мне очень неправильным. Если браузер неактивен, и в очереди есть события, они должны срабатывать.
Кто-нибудь видел такое поведение? Я наткнулся на способ блокировки диспетчера событий? Может, мне что-то не хватает - спасибо.
Обновление: Не удается воспроизвести на Windows 7.
Update 2: перезапущен Chrome на Mac, больше не может повторить. Итак, худший возможный результат: нет ответа, почему это произошло, почему это продолжалось, почему это не произошло надежно, почему оно ушло, и почему этого больше не будет.