Функции асинхронного обратного вызова всегда будут запускаться после завершения всего синхронного кода.Это связано с тем, что в JS есть нечто, называемое циклом обработки событий, который выглядит следующим образом:
![enter image description here](https://i.stack.imgur.com/Zyb2t.png)
Всякий раз, когда мы часто выполняем асинхронную операцию, это связано с веб-API,Этот веб-API удален от нас.Нам не нужно знать, как браузер реализует эту функцию (которая, вероятно, написана на C ++ как часть браузера).Тем не менее, нас интересует значение операции или возможное возвращаемое значение.
Итак, что делает браузер, когда веб-интерфейсы завершаются, обратный вызов, связанный с ним, помещается в очередь обратного вызова .Затем всякий раз, когда стек пуст, цикл обработки событий помещает функцию в стек.
Именно поэтому асинхронные операции всегда будут выполняться последними, , поскольку цикл обработки будет ожидать, пока стек не будет пусттолкая предмет на нем.