И чем асинхронная логика отличается от чистой асинхронности?
let x=1
function foo() { x=x+1 } ///синхронная функция, выполнится полностью при вызове
function boo() { //синхронная функция, тоже выполнится полностью
setTimeout(foo, 1000) // асинхронная логика, через некоторое время после выполнения этого кода, выполнится foo
}
boo()// синхронный вызов
foo()// тоже синхронный вызов
function foo(callback) { callback(12) } // можно было и не колбеком назвать
function boo(x) {console.log(x)} //тут она просто функция, и не в курсе что сейчас ее используют как колбек
foo(boo) // вызываем foo, передаем ей boo, она эту boo вызовет с параметром 12.