Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.11.2015, 23:37
Новичок на форуме
Отправить личное сообщение для extrasens Посмотреть профиль Найти все сообщения от extrasens
 
Регистрация: 02.11.2015
Сообщений: 1

Последовательность выполнения функций
Заранее извиняюсь, если такая тема уже была. У меня такой нубский вопрос, я новичок в js:
При определенных условиях необходимо последовательное выполнение функций:
function foo1 () {};
function foo2 () {};
function foo3 () {};

Результатом работы функции foo1 будет изменение html кода страницы.
Функция foo2 работает как раз таки с этим html кодом и на основе его выполняет определенные действия и так же вносит свои коррективы в html. Функция foo3 по тому же принципу. Объединить их в одну нельзя, так как они выполняют разные задачи и такое последовательное выполнение только частный случай.
В общем такая проблема. Если их просто выполнять последовательно, то функция foo2 начнет свое выполнение до того, как будут внесены изменения в Html функцией foo1 и тд. Если ставить setTimeout то все работает, но я думаю, что это очень коряво. Так как функции могут быть очень объемными и их выполнение будет зависеть от загруженности браузера в данный момент, да и вообще от производительности системы. Т.е. это время может быть разным.
Можно ли как то без таймаутов осуществить последовательный запуск этих функций по принципу: Функция foo1 выполнилась, сформировалось новое DOM дерево, далее пошла функция foo2, сформировала свое дерево и т.д. Заранее спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 02.11.2015, 23:43
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

extrasens,

https://learn.javascript.ru/promise
http://habrahabr.ru/company/mailru/blog/269465/
Load - как дождаться загрузки

Последний раз редактировалось рони, 02.11.2015 в 23:50.
Ответить с цитированием
  #3 (permalink)  
Старый 03.11.2015, 14:03
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,138

Сообщение от extrasens
Результатом работы функции foo1 будет изменение html кода страницы.
Функция foo2 работает как раз таки с этим html кодом и на основе его выполняет определенные действия и так же вносит свои коррективы в html. Функция foo3 по тому же принципу. Объединить их в одну нельзя, так как они выполняют разные задачи и такое последовательное выполнение только частный случай.
В общем такая проблема. Если их просто выполнять последовательно, то функция foo2 начнет свое выполнение до того, как будут внесены изменения в Html функцией foo1 и тд. Если ставить setTimeout то все работает, но я думаю, что это очень коряво. Так как функции могут быть очень объемными и их выполнение будет зависеть от загруженности браузера в данный момент, да и вообще от производительности системы. Т.е. это время может быть разным.
Тут явная ошибка в логике =(.
Стандарт гарантирует что JS выполняется строго последовательно т.е. функции вызываются только в том порядке в котором они вызваны и никак иначе. Функция foo2 не может быть вызвана до того как функция foo1 завершит свою работу.

Пальцем в небо но скорее всего ты ошибочно считаешь что функция foo1 вносит изменения в страницу а она на самом деле она просто делает асинхронный запрос и завершается а изменения в странице происходят когда то в будущем когда вернется ответ на запрос будет вызвана другая функция которая и будет вносить изменения в страницу.
Ответить с цитированием
  #4 (permalink)  
Старый 06.11.2015, 16:22
Аспирант
Посмотреть профиль Найти все сообщения от loljs
 
Регистрация: 06.11.2015
Сообщений: 68

Сообщение от MallSerg Посмотреть сообщение
Функция foo2 не может быть вызвана до того как функция foo1 завершит свою работу.
Если функции содержат асинхронный код, код содержащийся в них, может быть вызван когда угодно, надо знать что внутри функций. Возможно нужна синхронизация.

Последний раз редактировалось loljs, 06.11.2015 в 16:25.
Ответить с цитированием
  #5 (permalink)  
Старый 10.01.2020, 10:39
Аватар для GrEb
Интересующийся
Отправить личное сообщение для GrEb Посмотреть профиль Найти все сообщения от GrEb
 
Регистрация: 12.02.2010
Сообщений: 14

легко проверяется
<!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 любого значения и присваивать функцию какой-нибудь переменной.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AJAX и Deferred: последовательность выполнения обработчиков dmsuslov AJAX и COMET 2 30.07.2014 17:32
Последовательность выполнения функций Алек jQuery 8 21.06.2013 21:48
Последовательность функций как в jquery platedz Events/DOM/Window 54 09.01.2013 05:07
Последовательность выполнения функций nematod Общие вопросы Javascript 7 25.02.2011 03:16
Последовательность выполнения в динамическом js sovka Общие вопросы Javascript 2 18.10.2008 15:58