Javascript - равные интервалы времени - случайный порядок выполнения, даже если Javascript является однопоточным?

Я запутался, когда прочитал, что когда я устанавливаю (одно и то же) время в 2 методах timeSetout, порядок, в котором будет вызываться функция, не всегда может быть предсказан (не было предоставлено обоснование).

setTimeout(()=> console.log("first"), 5000);
setTimeout(()=> console.log("second"), 5000); 

Как я понимаю, тайм-ауты будут добавлены в таблицу событий, которая отслеживает события (в данном случае это время), а затем отправляет их в очередь событий, в которой хранится порядок, в котором функции должны быть выполняется, затем цикл обработки событий проверяет и отправляет эти функции в стек вызовов.

Так как первый тайм-аут (ведение журнала "первый") добавляется ПЕРВЫМ в таблицу событий, я бы предположил, что это ПЕРВЫЙ для отправки в очередь событий (также учитывая, что очередь событий является структурой данных stak), а ПЕРВЫЙ - отправить в стек вызовов во время цикла событий.

Я не мог найти что-либо об этом в Интернете, а также не было причин, по которым он мог быть выполнен в случайном порядке, и был бы рад получить ответ!

Кроме того, на заметку: не мог бы кто-нибудь объяснить, когда условия гонки могут быть возможны, как если бы вышеприведенное не соответствует действительности, я не могу придумать ни одного случая, так как javascript является однопоточным. Спасибо!!

1 ответ

В спецификации говорится следующее (выделение добавлено):

  1. Если контекст метода является объектом Window, подождите, пока Документ, связанный с контекстом метода, не станет полностью активным в течение дополнительных тайм-аутов (не обязательно последовательно). В противном случае контекст метода является объектом WorkerGlobalScope; подождите, пока не истечет время ожидания, если рабочий не приостановлен (необязательно последовательно).

  2. Дождитесь завершения любых вызовов этого алгоритма, имеющих тот же контекст метода, который начался до этого, и время ожидания которого равно или меньше, чем у этого.

Насколько я понимаю, это должно обеспечить выполнение в порядке, и вы всегда будете видеть first а потом second,

Другие вопросы по тегам