Рассмотрим этот фрагмент кода:
Я вызываю callback
из функции dothis
.Обратите внимание, что callback
в dothis
находится внутри timeout
console.log("start");
doThis(":)", callback)
function callback(a) {
console.log('in callback '+ a)
}
function doThis(a,cb) {
setTimeout(() => {
cb(a)
}, 2000);
console.log('in first function')
}
console.log("end")
Я получаю следующий результат:
start
in first function
end
in callback :)
Теперь рассмотрим ниже,
Все то же самое, за исключением того, что на этот раз нет timeout
:
console.log("start");
doThis(":)", callback)
function callback(a) {
console.log('in callback '+ a)
}
function doThis(a,cb) {
cb(a);
console.log('in first function')
}
console.log("end")
Я получаю следующий результат:
start
in callback :)
in first function
end
- Говорят, что обратный вызов в JavaScript можетвызываться асинхронно или синхронно.Откуда вы знаете, что он вызывается любым из этих способов?
- Кажется,
timeout
показывает ожидаемое асинхронное поведение.Без тайм-аута мой код ведет себя так, будто обратный вызов вызывается синхронно согласно зарегистрированным сообщениям.Мое понимание семантики выполнения до завершения заставляет меня думать, что я всегда должен получать первый результат, независимо от того, сколько времени потребуется для обработки обратного вызова.Насколько я понимаю, JavaScript выполняет текущую активность (код JavaScript) до конца, а любая асинхронная активность (обратный вызов) ставится в очередь (в очереди событий) для последующего выполнения.
В этом случае кажется, что если результат обратного вызова готов, он регистрируется перед следующими сообщениями.Когда оно задерживается, оно регистрируется последним.Это асинхронное поведение?