«Обратные вызовы» обычно используются в сочетании с асинхронными процессами, такими как запросы ajax или обработчики событий, связанные с пользовательским интерфейсом.В этих случаях мы называем их «обратными вызовами», так как их нужно выполнять после чего-то еще, и ясно, где логика программы подхватит этот «вызов» после того, как асинхронный процесс завершен или запущен, возвращает нас «назад».
Используя setTimeout () вы можете добавить в стек цикла событий.Используя обещание, вы можете вызывать стек в цикле событий, ожидая завершения асинхронного процесса.
Ваш код ничего не делает для прерывания синхронного потока кода.Этот фрагмент демонстрирует, как, хотя мы добавили тайм-аут 0, который должен задерживать действие, мы можем ожидать обещание разрешить запуск стека цикла событий.
function myfun(a, b, callback) {
console.log(a);
callback();
console.log(b);
}
function cb() {
console.log('hi')
}
myfun(1, 2, cb) // result: 1 hi 2
// same behavior as above
function myStaticFun() {
console.log(1);
cb();
console.log(2);
}
myStaticFun();
// now same as before using a promise to wait a moment and the event loop stack is invoked during the pause
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function myEventLoopInvokingFun(a, b, callback) {
console.log(a);
setTimeout(callback, 0)
await sleep(0);
console.log(b);
}
myEventLoopInvokingFun(1, 2, cb);