Последовательность выполнения функций
Заранее извиняюсь, если такая тема уже была. У меня такой нубский вопрос, я новичок в js:
При определенных условиях необходимо последовательное выполнение функций:
function foo1 () {};
function foo2 () {};
function foo3 () {};
Результатом работы функции foo1 будет изменение html кода страницы. Функция foo2 работает как раз таки с этим html кодом и на основе его выполняет определенные действия и так же вносит свои коррективы в html. Функция foo3 по тому же принципу. Объединить их в одну нельзя, так как они выполняют разные задачи и такое последовательное выполнение только частный случай. В общем такая проблема. Если их просто выполнять последовательно, то функция foo2 начнет свое выполнение до того, как будут внесены изменения в Html функцией foo1 и тд. Если ставить setTimeout то все работает, но я думаю, что это очень коряво. Так как функции могут быть очень объемными и их выполнение будет зависеть от загруженности браузера в данный момент, да и вообще от производительности системы. Т.е. это время может быть разным. Можно ли как то без таймаутов осуществить последовательный запуск этих функций по принципу: Функция foo1 выполнилась, сформировалось новое DOM дерево, далее пошла функция foo2, сформировала свое дерево и т.д. Заранее спасибо. |
|
Цитата:
Стандарт гарантирует что JS выполняется строго последовательно т.е. функции вызываются только в том порядке в котором они вызваны и никак иначе. Функция foo2 не может быть вызвана до того как функция foo1 завершит свою работу. Пальцем в небо но скорее всего ты ошибочно считаешь что функция foo1 вносит изменения в страницу а она на самом деле она просто делает асинхронный запрос и завершается а изменения в странице происходят когда то в будущем когда вернется ответ на запрос будет вызвана другая функция которая и будет вносить изменения в страницу. |
Цитата:
|
легко проверяется
<!DOCTYPE HTML>
<html>
<head>
<title>Untitled</title>
</head>
<body>
<script>
var i = 5;
function one()
{
var a;
for (i = 0; i<1000000; i++)
{
a=Math.acos(Math.cos(Math.PI));
document.title = a;
}
}
function two()
{
alert(i);
}
one();
two();
</script>
</body>
</html>
Вторая функция всегда выводит 1000000, так как запускается строго после завершения первой. Если хочется 100% пароноидальной уверенности, можно ж вставить в 1-ю функцию в конце return любого значения и присваивать функцию какой-нибудь переменной. |
| Часовой пояс GMT +3, время: 21:49. |