Javascript и время, особенно с обратными вызовами - PullRequest
0 голосов
/ 12 мая 2010

Я хочу убедиться, что правильно понимаю обратные вызовы, синхронизацию JavaScript и т. Д. В целом.

Скажите, что мой код выглядит следующим образом, он гарантированно выполняется по порядку?

SetList();  // initializes the var _list

Some.Code(_list, function(data) {

      // update list

});

DoSomething(_list);   // operates on _list

Обновление

То, что я вижу, это вызовы SetList, затем DoSomething, затем Some.Code.

Some.Code вызывает другую функцию. так:

Some.Code(_list, function() {

    //load _list from ajax request
    Other.Code.WithCallback(_list, function(){....});

});

Думаю, чтобы это исправить, я должен добавить DoSomething к внутренней функции в качестве еще одного обратного вызова?

Ответы [ 2 ]

1 голос
/ 12 мая 2010

SetList(), Some.Code() и DoSomething() будут выполняться в этом порядке, один за другим. Анонимная функция, переданная в качестве второго аргумента Some.Code(), может быть вызвана во время выполнения Some.Code() (до возврата функции и вызова DoSomething()), или она может быть вызвана позднее другой функцией и обработчиком события. или таймер, все зависит от того, когда вы указали его для вызова.


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

Если вы хотите, чтобы DoSomething() выполнялся после получения ответа через ajax, вам следует запустить его до конца функции обратного вызова.

0 голосов
/ 12 мая 2010

Этот код будет выполняться в следующем порядке:

SetList (), затем Some.Code (), затем функция (данные), затем DoSomething ().

JavaScript является однопоточным и выполняется по порядку. Единственный способ, которым все будет происходить не синхронизировано, это если вы установите интервал / таймер в Some.Code () или функции (data), которая вызвала другую функцию.

Если у вас было:

var i=0;
functionCall() //some long process that sets i=1;
if (i==1) { alert("In Order!"); } else { alert("Out of Order!"); }

Это предупредит «В порядке» Но если бы у вас было:

var i=0;
setTimeout(functionCall, 1000) //some long process that sets i=1;
if (i==1) { alert("In Order!"); } else { alert("Out of Order!"); }

Это выполнит "Out of Order", , потому что третья строка будет выполнена перед вызовом functionCall ().

Обновленный ответ

Поскольку вы используете Ajax, я предполагаю, что вы делаете асинхронный вызов, что является причиной задержки. У вас есть функция обратного вызова, но она все еще ожидает вызова, поэтому Javascript переходит к выполнению следующей строки в ожидании.

Чтобы выполнить в нужном вам порядке, вам нужно сделать следующее:

SetList();  // initilizes the var _list
Some.Code(_list, function(data) {
  // update list
  DoSomething(_list);   // operates on _list
});

Таким образом, вы можете убедиться, что DoSomething () вызывается при вызове вашего метода обратного вызова, а не раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...