Это все еще в той же теме. Однако, для большинства практических целей, если у вас такой продолжительный JavaScript, что вы беспокоитесь, что ваша «основная» задача может заблокировать вызов setTimeout, вам следует рассмотреть возможность повторения вашего базового подхода.
Обновление для награды:
Чтобы расширить более общий вопрос о многопоточности в JavaScript, есть отличная дискуссия с очень откровенным ответом от Bobince. Он приводит несколько очень интересных сценариев, которые могут поставить под вопрос, можем ли мы действительно считать JS однопоточным, и его вывод «не совсем».
Заключение комментариев, с которыми я согласен, заключается в том, что с точки зрения среды выполнения JS юниверс является однопоточным, но , поскольку инфраструктура, окружающая песочницу JS, , а не однопоточный, он может проникать внутрь песочницы и неожиданно попадать в состояние . Внутри среды выполнения некая неизвестная сущность может «приостановить действие законов природы» и изменить ситуацию вокруг. Но среда выполнения не имеет потоковой конструкции, которая могла бы обрабатывать этот сценарий изначально.
Я думаю, что самый важный способ подойти к этому вопросу - это спросить, что мы подразумеваем под многопоточностью в практическом сценарии? Обычно проблемы с потоками сводятся к таким вещам, как синхронизация, которую мы должны предположить, что производители браузеров решили за нас, потому что, опять же, у JavaScript нет нативной конструкции, позволяющей даже пытаться справиться с ней самостоятельно. Ручные зазубринки при нарезке резьбы бесполезны без инструментов, чтобы это исправить; нет мьютексов или блокировок.
Итак, оставив в стороне эти виды катастрофических проблем, мы дошли до того, что, возможно, значение неожиданно изменится из-под нас. Но хорошо написанный код должен быть в порядке с этим. Даже в примере Bobince весь задействованный код по-прежнему является кодом, который мы добровольно включили в страницу (даже написали сами), поэтому, может быть, будет удивительно, если этот код будет запущен, когда ваш основной вызов стека якобы «заблокирован». Но, опять же, говоря о практических проблемах, что вы можете сделать для себя хуже в этом сценарии? Ничего серьезного.
Так что мой длинный способ сказать: я не знаю ни одной документации от поставщиков браузеров, где они однозначно говорят, является ли их реализация JS однопоточной или нет, но я сомневаюсь, имеет ли это значение.