javascript: функция, выполняемая в более поздний момент времени после обновления переменных - PullRequest
2 голосов
/ 13 ноября 2011

Это проблема с Javascript, выполняющимся линейно в одном потоке.

с использованием

  setTimeout(function(){},time);

оценивается и выполняет function() немедленно.

Яищет метод для выполнения function() за x секунд, например, после того, как dom был обновлен с помощью вызова ajax.

Как это сделать?

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

для ясности, если вы сделали что-то подобное внутри функции ();

      var a= document.getElementbyId("anid").innerHTML;

var a будет собираться во время обработки setInterval, а не через x секунд при выполнении функции.

Спасибо ...

Ответы [ 2 ]

2 голосов
/ 13 ноября 2011

Ваш пример с setTimeout будет выполнять функцию не сразу, а после того, как будет ожидать число миллисекунд, указанное в 'time'. Например, чтобы показать предупреждение за 3 секунды:

window.setTimeout ( function() { alert ('Test'); }, 3000);

Обратите внимание, что даже если вы используете 0 в качестве значения времени, выполнение функции все еще откладывается до тех пор, пока текущий стек выполнения Javascript не завершится , что полезно при определенных обстоятельствах, но не в вашем случае.

Как говорит santiagoIT, вы никогда не должны полагаться на такую ​​стратегию для выполнения каких-либо действий, которые зависят от того, завершился ли конкретный вызов AJAX. Вместо этого вы должны использовать функции обратного вызова. Это связано с тем, что при использовании таймеров DOM может быть еще не готов во время выполнения вашей функции (например, если компьютер работает медленно), эта проблема с многопоточностью известна в Computer Science как «Состояние гонки».

Чтобы избежать условий гонки, используйте функции обратного вызова. Пример использования библиотеки jQuery будет выглядеть следующим образом:

$.get("/url/ajax/getSomething", parameterArray, callbackFunction);

function callbackFunction(data) {
    alert ('Work with DOM here');
}
2 голосов
/ 13 ноября 2011

Лучше выполнять свою функцию после завершения вызова ajax. Вы можете зарегистрировать функцию успеха / неудачи, которая будет вызываться после завершения вызова. Это правильный способ сделать это.

Вот пример с jquery:

$.ajax({
  url: "test.html",
  context: document.body,
  success: function(){
    // here you do whatever you want after ajax is finished
  }
});

** РЕДАКТИРОВАТЬ ** Убрано предложение передавать функцию обратного вызова в виде строки, основанной на комментариях Квентина ниже, поскольку это действительно не очень хорошая практика.

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