Javascript.RU

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

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

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

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

Заранее всем мпасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 15.11.2009, 14:00
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Она и так выполняется после Func1.
Ответить с цитированием
  #3 (permalink)  
Старый 15.11.2009, 14:58
Аспирант
Отправить личное сообщение для San4ezy Посмотреть профиль Найти все сообщения от San4ezy
 
Регистрация: 15.11.2009
Сообщений: 38

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

При тестировании получается так, что Funk2() выполняется раньше чем Funk1().
Ответить с цитированием
  #4 (permalink)  
Старый 15.11.2009, 15:27
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Это уже не функция, а данные фрейма загружаются асинхронно. У фрейма есть событие onload, вот на него и вешайте Funk2.
Ответить с цитированием
  #5 (permalink)  
Старый 15.11.2009, 16:51
Аспирант
Отправить личное сообщение для San4ezy Посмотреть профиль Найти все сообщения от San4ezy
 
Регистрация: 15.11.2009
Сообщений: 38

Привожу кусок кода:
<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());">

Алерты добавлены для проверки
Первая функция запускается первой, вторая - ворой.
При этом алерт второй функции появляется раньше.
Это значит что вторая функция не дожидается полного выполнения первой.
Как сделать чтобы она дожидалась?
Ответить с цитированием
  #6 (permalink)  
Старый 15.11.2009, 16:55
Аспирант
Отправить личное сообщение для San4ezy Посмотреть профиль Найти все сообщения от San4ezy
 
Регистрация: 15.11.2009
Сообщений: 38

Octane, я так и делаю, но всеравно результат не тот. Может я неправильно использую онлоад?
Ответить с цитированием
  #7 (permalink)  
Старый 15.11.2009, 16:55
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

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

Где ты видишь, что функции выполняються асинхронно?! Копай в другом месте...
Ответить с цитированием
  #8 (permalink)  
Старый 15.11.2009, 17:23
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

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

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

функция выполняется сразу же и возвращает undefined, которым и инициализируется обработчик события.
Нужно передавать ссылку на функцию:
newframe.onload = Funk2;
Ответить с цитированием
  #9 (permalink)  
Старый 15.11.2009, 17:46
Аспирант
Отправить личное сообщение для San4ezy Посмотреть профиль Найти все сообщения от San4ezy
 
Регистрация: 15.11.2009
Сообщений: 38

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


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

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

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

Может это из-за браузера? Тестил в Опере
Мозилла и ИЕ вообще не выдают алерт 2й функции
Ответить с цитированием
  #10 (permalink)  
Старый 15.11.2009, 18:55
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

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

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

function F() {
    a = 2;
}

setTimeout(F, 100);

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

Последний раз редактировалось Octane, 15.11.2009 в 19:03.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как дождаться ПОЛНОЙ загрузки страницы? arma Events/DOM/Window 7 04.11.2009 20:05
Как поставить тайм-аут для выполнения скрипта cln2008 Общие вопросы Javascript 7 23.09.2009 14:57
Как вывести на экран значение функции SELECT MAX(id) Владдд Серверные языки и технологии 3 25.01.2009 16:07
Как проверить существование функции Aderba Общие вопросы Javascript 2 14.11.2008 16:09
Помогите разобраться в повторным обращении к функции, как её обнулить. AdvoGad Общие вопросы Javascript 0 01.09.2008 11:35