Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Как дождаться полного выполнения функции? (https://javascript.ru/forum/events/6163-kak-dozhdatsya-polnogo-vypolneniya-funkcii.html)

San4ezy 15.11.2009 13:46

Как дождаться полного выполнения функции?
 
Добрый день!
Пользовался поиском, не нашел ответа. Если такая тема уже обсуждалась, прошу дать ссылочку.

Ситуация такая:
Есть две функции
Funk1();
Funk2();
Они выполняются последовательно в одном обработчике. Но нужно чтобы Funk2() начала свое выполнение только тогда, когда Funk1 выполнится полностью.

Подскажите плиз как это реализовать?

Заранее всем мпасибо!

B~Vladi 15.11.2009 14:00

Она и так выполняется после Func1.

San4ezy 15.11.2009 14:58

Цитата:

Сообщение от B~Vladi (Сообщение 35338)
Она и так выполняется после Func1.

Это если Funk1() выполняет какие-то вычисления и т.д. Но в моем случае Funk1() подгружает фрейм и делает некоторые процедуры с его содержимым. А Funk2() уже потом работает с результатами Funk1().

При тестировании получается так, что Funk2() выполняется раньше чем Funk1().

Octane 15.11.2009 15:27

Это уже не функция, а данные фрейма загружаются асинхронно. У фрейма есть событие onload, вот на него и вешайте Funk2.

San4ezy 15.11.2009 16:51

Привожу кусок кода:
<script type="text/javascript">
var Result;//переменная результата
function Funk(){// обработчик события нажатия кнопки
  Funk1();
  return Result;
}

function Funk1(){
  newframe=document.createElement("iframe");
  document.body.insertBefore(newframe,document.getElementById("mydiv"));
  newframe.src="test_content.html";
  newframe.onload=Funk2();//ждем загрузки фрейма и выполняем вторую функцию
  alert("Funk1");
}

function Funk2(){
  Result=document.frames[0].document.body.innerHTML;//берем содержимое фрейма
  newframe.parentNode.removeChild(newframe);//удаляем фрейм
  alert("Funk2");
}

</script>
<div id="mydiv"></div>
<input type="button" value="Test" onclick="alert(Funk());">

Алерты добавлены для проверки
Первая функция запускается первой, вторая - ворой.
При этом алерт второй функции появляется раньше.
Это значит что вторая функция не дожидается полного выполнения первой.
Как сделать чтобы она дожидалась?

San4ezy 15.11.2009 16:55

Octane, я так и делаю, но всеравно результат не тот. Может я неправильно использую онлоад?

B~Vladi 15.11.2009 16:55

function fnc1(){alert (1)}
function fnc2(){alert (2)}
fnc1();
fnc2();

Где ты видишь, что функции выполняються асинхронно?! Копай в другом месте...

Octane 15.11.2009 17:23

Цитата:

Сообщение от San4ezy
newframe.onload=Funk2();

Что возвращает функция Funk2? Смотрим:
alert(Funk2()); // получаем сообщение "undefined"

то есть запись выше равносильна следующей:
newframe.onload = undefined;

функция выполняется сразу же и возвращает undefined, которым и инициализируется обработчик события.
Нужно передавать ссылку на функцию:
newframe.onload = Funk2;

San4ezy 15.11.2009 17:46

Да, тут провтыкал.
newframe.onload = Funk2;


Но теперь обработчик кнопки заканчивает выполнение раньше чем вторая функция:

сообщения в таком порядке:
Funk1
Undefined
Funk2

И только если нажать на кнопку еще раз, то :
Funk1
Текст из фрейма
Funk2

Может это из-за браузера? Тестил в Опере
Мозилла и ИЕ вообще не выдают алерт 2й функции

Octane 15.11.2009 18:55

Цитата:

Сообщение от San4ezy
Но теперь обработчик кнопки заканчивает выполнение раньше чем вторая функция

Все правильно, Func2 выполняется асинхронно, когда будет загружен фрейм, остальной код не будет ждать выполнения Func2. Как не переставляйте местами функции и алерты, от асинхронности вы не уйдете, теперь результат Result нужно выводить в Func2.

Почитайте про асинхронное программирование.
var a = 1;

function F() {
    a = 2;
}

setTimeout(F, 100);

alert(a); // чему равно a?


Часовой пояс GMT +3, время: 13:13.