Представьте себе, например, что у вас есть что-то вроде этого:
var something;
foo(); //Inside foo, the value of something is set to the result of an AJAX call
console.log(something);
В строке console.log
будет напечатано undefined
, поскольку переменная something
будет оставаться пустой до тех пор, пока ответ AJAX в foo
не изменит ее. Это ситуация, в которой обратный вызов полезен - в обратном вызове вы можете присвоить значение ответа something
, и тогда вы узнаете, что something
имеет значение.
Ваш пример очень похож на этот - foobar
будет вызван, как только foo
вернется, и если foo
содержит некоторую асинхронную логику, он вернется до того, как завершится. Если вы хотите, чтобы foobar
выполнялся после, вам нужно будет вызвать его из (или использовать как) функцию обратного вызова.
Можно было бы заставить foo
ждать, пока все, что он сделает, завершится, но это, вероятно, лишит смысла использование AJAX, поскольку вам придется отправлять синхронный запрос.