Асинхронный / Синхронный Javascript - PullRequest
4 голосов
/ 19 июля 2011

У меня возникли проблемы с пониманием различий между асинхронным и синхронным Javascript, и я надеялся, что кто-то может пролить свет на это.

Я знаю, что Javascript по своей сути синхронен, но вы можете использовать асинхронные события / обратные вызовыизменить поток вашей программы.Однако что произойдет, если вы вызовете функцию без обратного вызова, которая содержит AJAX?

Например, если у меня есть следующий код, где foo () содержит какой-то запрос к серверу, а foobar () содержит некоторый выходной текст:

foo();
foobar();

Будет ли вызываться foobar () до завершения внутренней логики в foo (), или браузер будет ждать полного выполнения foo () перед вызовом foobar ()?(Это кажется простым, но моя путаница возникает из-за обратных вызовов и того, являются ли они абсолютно необходимыми во всех случаях для контроля потока вашей программы, т. Е. Всегда ли необходим foo (foobar).)

Кроме того, если foo () содержит серверный вызов, который быстро выполняется на стороне клиента, но занимает много времени на сервере для обработки, является ли обратный вызов единственным способом, которым я могу заставить свою программу ждать, пока foo () полностью не выполнится?

Ответы [ 5 ]

3 голосов
/ 19 июля 2011

foobar () действительно будет вызван до завершения вызова Ajax в foo () ...

Если это не ответ на ваш второй вопрос, вы указываете, что вызов Ajax должен быть синхронным, что является опцией. Это заставит пользователя ждать, пока вызов не завершится, прежде чем он сможет что-либо сделать, так что обычно это не лучший выбор. Обычно лучше всего использовать обратный вызов.

2 голосов
/ 19 июля 2011

Будет ли вызываться foobar () до завершения внутренней логики в foo ()

Ответ на этот вопрос зависит от того, что вы подразумеваете под «внутренней логикой». foobar будет вызываться только после завершения всего javascript в foo. Однако он не будет ожидать возврата вызова AJAX (вид всей точки A в AJAX).

1 голос
/ 19 июля 2011

Представьте себе, например, что у вас есть что-то вроде этого:

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, поскольку вам придется отправлять синхронный запрос.

1 голос
/ 19 июля 2011

Проще говоря, foo () будет полностью выполняться внутри перед запуском foobar (). Однако, если в foo () есть вызов для выполнения ajax-запроса, этот запрос будет отправлен, а затем будет выполнен параллельно.

После отправки запроса обработка будет продолжена. Запрос ajax вернется с ответом, когда он будет завершен, который может или не может быть получен при дальнейшей обработке.

1 голос
/ 19 июля 2011

Все foo будут запущены, затем все foobar будут работать.

Часть foo может сказать «асинхронно отправлять HTTP-запрос», и в этом случае он не будет ждать ответа, прежде чем продолжить (но поскольку foo только инициирует отправку запроса, это считается завершенным).

Если был обратный вызов, он запускался, когда приходил ответ (что обычно происходит после завершения foobar).

...