Это асинхронный из любого вызова javascript? - PullRequest
0 голосов
/ 03 августа 2011

Я новичок в javascript, не могу понять, почему все вызовы javascript асинхронны, например,

, у нас есть вызовы с порядком, подобным

call_function1;

call_function2:

, если function2 зависит от результатов функции1, что не может быть гарантировано, потому что выполнение асинхронно.Это правда ?И почему?

Если это правда, как убедиться, что они синхронны.

Если это дублированный вопрос, я прошу прощения, потому что это тихий новый для меня.

Спасибо за ваш ответ первым.

Ответы [ 5 ]

1 голос
/ 03 августа 2011

JavaScript-вызовы синхронны. Если вторая функция зависит от результатов первой функции, вы можете использовать модель обратных вызовов.

function foo(callback) {
  var results = // get some results;
  callback(results);
}

function boo(results) {
  // do something with results here..
}

foo(boo);
1 голос
/ 03 августа 2011

Нет Javascript имеет функции, которые гарантируют порядок и ведут себя так же, как другие языки.Например:

function f1() {
  alert(1);
}

function f2() {
  alert(2);
}

f1();
f2();

Вы получите всегда , получите 1, а затем 2. Более того, javascript AFAIK работает в одном потоке, поэтому вам не нужно беспокоиться о состоянии гонки.

Асинхронная часть JavaScript происходит из-за ожидания событий.Например, если вы делаете 2 ajax-запроса (a в ajax означает асинхронный, это подсказка), вы не можете гарантировать, что он вернется первым, и, таким образом, если у вас есть разные обратные вызовы для двух запросов, вы не можете гарантировать, какой из них будет вызван.первый.

0 голосов
/ 03 августа 2011

Как уже упоминалось в комментариях к вашему вопросу, вызовы функций JavaScript обычно не асинхронны.Следующее будет выполнено в следующем порядке:

function sayHello() {
   console.log("Hi");
}
function sayBye() {
   console.log("Bye");
}
sayHello();
sayBye();

Приведенный выше код сначала напечатает «Привет», а затем «Пока», поскольку вызовы sayHello и sayBye находятся в этом порядке.*

Однако, если функция выполняет какое-либо действие асинхронно, и у вас есть другая функция, которая зависит от результата, вы можете предоставить вторую функцию в качестве обратного вызова для асинхронного запроса.Например:

xmlHttpRequestObj.onreadystatechange = function() {
   if(xmlHttpRequestObj.readyState == 4 && xmlHttpRequestObj.status == 200) {
      //Asynchronous call returned successfully. Do something that relies on that here.
   }
}
0 голосов
/ 03 августа 2011

Я не знаю, как вы говорите, что "Javascript обычно называют асинхронным".Как правило, все наоборот: Javascript почти всегда не асинхронный.

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

function1();
function2();

Если вы назначаете обе эти функции одному событию, они будут вызваны одновременно, но не будут выполняться в параллельно .То же самое, если оба они вызываются в одновременно (с использованием setTimeout) или как обратный вызов Ajax.См. Гарантируется ли JavaScript однопоточным? для очень хорошего объяснения.

Возможно, вы слышали, что Ajax является асинхронным.Это верно, когда вы рассматриваете запрос к серверам, не мешая пользователю, «в фоновом режиме».Но это не значит, что Javascript является асинхронным.Фактически, даже с вызовами Ajax, часть javascript является однопоточной.

0 голосов
/ 03 августа 2011

Вызов двух функций подряд определенно не асинхронный.

На самом деле .. javascript на 100% синхронен.Если вы не используете «веб-работников», весь javascript всегда будет работать в одном потоке, в одном процессе.Никогда не было ситуации, когда 2 сценария выполняются одновременно.

Даже если вы обрабатываете событие, например, из XMLHTTPRequest, событие будет запущено только после остановки всего другого кода JavaScriptвыполнение.

...