В асинхронном API колбэк вызывают позже (или по событиям): текущий стек продолжается, а тело колбэка выполнится, когда придёт время — всё ещё в том же JS-потоке.
Подробности
Контракт должен описывать: когда и сколько раз вызывается, как передаются ошибки, как отписаться/отменить.