Javascript - равные интервалы времени - случайный порядок выполнения, даже если Javascript является однопоточным?
Я запутался, когда прочитал, что когда я устанавливаю (одно и то же) время в 2 методах timeSetout, порядок, в котором будет вызываться функция, не всегда может быть предсказан (не было предоставлено обоснование).
setTimeout(()=> console.log("first"), 5000);
setTimeout(()=> console.log("second"), 5000);
Как я понимаю, тайм-ауты будут добавлены в таблицу событий, которая отслеживает события (в данном случае это время), а затем отправляет их в очередь событий, в которой хранится порядок, в котором функции должны быть выполняется, затем цикл обработки событий проверяет и отправляет эти функции в стек вызовов.
Так как первый тайм-аут (ведение журнала "первый") добавляется ПЕРВЫМ в таблицу событий, я бы предположил, что это ПЕРВЫЙ для отправки в очередь событий (также учитывая, что очередь событий является структурой данных stak), а ПЕРВЫЙ - отправить в стек вызовов во время цикла событий.
Я не мог найти что-либо об этом в Интернете, а также не было причин, по которым он мог быть выполнен в случайном порядке, и был бы рад получить ответ!
Кроме того, на заметку: не мог бы кто-нибудь объяснить, когда условия гонки могут быть возможны, как если бы вышеприведенное не соответствует действительности, я не могу придумать ни одного случая, так как javascript является однопоточным. Спасибо!!
1 ответ
В спецификации говорится следующее (выделение добавлено):
Если контекст метода является объектом Window, подождите, пока Документ, связанный с контекстом метода, не станет полностью активным в течение дополнительных тайм-аутов (не обязательно последовательно). В противном случае контекст метода является объектом WorkerGlobalScope; подождите, пока не истечет время ожидания, если рабочий не приостановлен (необязательно последовательно).
Дождитесь завершения любых вызовов этого алгоритма, имеющих тот же контекст метода, который начался до этого, и время ожидания которого равно или меньше, чем у этого.
Насколько я понимаю, это должно обеспечить выполнение в порядке, и вы всегда будете видеть first
а потом second
,