Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> jQuery, ajaxComplete или как-то еще? отловить завершение функции 
:(
    Опции темы
Leshak
Дата 14.7.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 19.10.2005

Репутация: нет
Всего: нет




есть несколько исходных функций в которых выполняются Ajax-запросы, получение и обработка результата. 

как можно определить с помощью ли jQuery или как-то, что данные не только получены, но и обработаны, чтобы запустить следующие процедуры?


PM MAIL   Вверх
Samotnik
Дата 14.7.2009, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: нет
Всего: 191



Код

$.ajax({
   type: "POST",
   url: "some.php",
   data: "name=John&location=Boston",
   success: function(msg){
     alert( "Data Saved: " + msg );  //  вот тут и есть результат 
   }
 });


 smile 
PM MAIL   Вверх
Leshak
Дата 14.7.2009, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 19.10.2005

Репутация: нет
Всего: нет



Samotnik, 

или я не понял крутости ответа, или плохо объяснил проблему...

Код


function a1(){
jQuery.getJSON( Url, function(json) { a2(json) ;});  // спросили
}

function a2(rj){              // услышали
  rj1 = function a3(rj);    //  обрабтали так 
  rj2 = function a4(rj1);    //  обрабтали эта 
  rj3 = function a5(rj2);    //  обрабтали ещё 
}
...
// прошли разные события
// но все повторяется, хоть и по другому

function a9(){
  function a1(); // спросили, и если ответили, то и обработали по вся-кому 
  rj9 = function a8(rj3); // а эта функция захочет выполниться не дожидаясь 
                                     // результатов a3, a4, a5...
}



вот такая у меня проблема..  smile 

Это сообщение отредактировал(а) Leshak - 14.7.2009, 16:23
PM MAIL   Вверх
Samotnik
Дата 14.7.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: нет
Всего: 191



Leshak, не понимаю. Что нужно ?
Узнать когда функция отработала ?  Продебаж  smile   firebug в помощь. 
PM MAIL   Вверх
Leshak
Дата 14.7.2009, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 19.10.2005

Репутация: нет
Всего: нет



Samotnik, 

угу.... значит забываю уже русский язык... попробую по другому:

по этому адресу http://www.walks.ru/new.html
лежит моя проблема

дорога до нее следующая (выбираем эти пункты среди других) :

[ Россия ][ Москва ][ Метро ][ Кольцевая линия ] - [ станция ’Киевская’ ]

на  станции ’Киевская’, после загрузки внизу страницы картинок с дополнительными видами этой станции, прокручиваем горизонтальный скрол вправо до конца и кликаем по последней картинке
открывается информация о том, что тут можно пересесть с "Кольевой линии" на "Арбатско-покровскую линию"

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

смотрим на пример выше:

Код

function a9(){
  function a1(); // спросили, и если ответили, то и обработали по вся-кому 
  rj9 = function a8(rj3); // а эта функция захочет выполниться не дожидаясь 
                                     // результатов a3, a4, a5...
}



а9 - обеспечивает "пересадку"
  а1 - загружает новый маршрут
  а8 - должна собрать описание конкретной станции,
но а8 запускается не дожитаясь окончания  процессов  а1, а2, а3, а4
и поэтому а8 не получает данные, необходимые для ее работы...  

отсюда и возникает мой вопрос - как можно запустить а8  только после того, как отработают все нужные процессы?


PM MAIL   Вверх
ksnk
Дата 14.7.2009, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 38
Всего: 386



Leshak, Сначала нужно четко себе представить, какую цепочку ajax-запросов и по каким действиям пользователя нужно сделать. У меня чего-то неполучилось smile


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
IDVsbruck
Дата 14.7.2009, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 778
Регистрация: 12.11.2006

Репутация: 4
Всего: 22



Блин, те же яйца, только в профиль ... функция а8 будет исполняться ДО того, как а2 назначит переменную rj3. Лучше ту же а8 вызывать по получению ответа с сервера.
PM MAIL   Вверх
Nigel
Дата 14.7.2009, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


познаю мир
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 20.11.2007

Репутация: 1
Всего: 19



Leshak, зачем вам эти a1-19, rj1-rj9. Сами же потом и путаетесь. Через неделю вообще забудете, как и что делали. Пишите нормально и придет к вам понимание.
PM MAIL   Вверх
Leshak
Дата 15.7.2009, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 19.10.2005

Репутация: нет
Всего: нет



ksnk, Nigel, 

как, что и в каком порядке должно выполняться я себе хорошо представляю
для того чтобы найти причину этой ошибки пришлось основательно переписать скрипт,  избавиться от излишнего кода и сделать текст читабельней и короче.
Цитата(Nigel @  14.7.2009,  21:54 Найти цитируемый пост)
Leshak, зачем вам эти a1-19, rj1-rj9. Сами же потом и путаетесь.

это только попытка объяснить свою проблемму, которая заключается в следующем - Ajax привел к тому, что программа исполняется не последовательно и возникают параллельные процессы.
JavaScript позволяет отлавливать разные события (клики, фокусы, загрузки) - но возникла необходимость ожидать выполнение  одних процессов, чтобы запускать следующие. На уровне ожидания XMLHttpRequest - это реализованно, а как быть с пользовательскими функциями?

Цитата(IDVsbruck @  14.7.2009,  21:06 Найти цитируемый пост)
Лучше ту же а8 вызывать по получению ответа с сервера. 


Угу - прощай структурное программирование, долой функции, вперед к линейному тексту и оператору GOTO !  :(


неужели никто не решал подобную проблему? 

PM MAIL   Вверх
ksnk
Дата 15.7.2009, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 38
Всего: 386



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

function a1(){
    a1.resourceComplete = false;
    $.ajax(...
      function(){
           a1.resourceComplete = true;
      }
}

Вот так - функция, которая для старта обязательно должна получить результат выполнения a1
Код

function a8(arg1,arg2,arg3){
// wait till all resources complete
  if(!a1.resourceComplete) {
    setTimeout(function(){
       a8.call(this,arg1,arg2,arg3)    
    },100);
    return ;
  }
   // do something
   a8.resourceComplete = true;
}

А вот обработчик события при котором обязательно должны выполниться a1 и a8
onclick="a1();a8(); return false;"

Это сообщение отредактировал(а) ksnk - 15.7.2009, 10:29


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Leshak
Дата 15.7.2009, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 19.10.2005

Репутация: нет
Всего: нет



ksnk, 

О! а про рекурсию я и не подумал - наверно по причине того, что память  и так расходуется неприлично и все еле шевелится...
Это уже ВАРИАНТ! - спасибо!
 надо будет проверить - пока поставил заглушку в другую ветку и ищу глюки... :(
PM MAIL   Вверх
youri
Дата 17.7.2009, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: нет
Всего: 16



Leshak, а почему не вызвать a8 в конце a2? Если после a2 не обязательно должна выполняться a8 или может выполняться другая функция, то можно передавать a8 в a2 через параметр. Всякие таймеры, имхо, крайний случай
PM   Вверх
Leshak
Дата 20.7.2009, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 19.10.2005

Репутация: нет
Всего: нет



youri, 
так сейчас и делаю - при запуске а9 вывешиваю флажок с параметром, а по завершении а2 проверяю его и в зависимости от параметра  запускаю или нет а8...
но это не красиво :(


ksnk, 
рекурсия с таймаутом работает как-то неустойчиво... да и выглядит кривова-то :(

хотелось бы иметь инструмент типа

$(function2() ).ready(   function8() { /* ... */}  );
по исполнению function2() выполнить function8()

...

PM MAIL   Вверх
ksnk
Дата 20.7.2009, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 38
Всего: 386



Ну, тогда примерно вот так
Код


//более корректный код лучше смотреть ниже...





Это сообщение отредактировал(а) ksnk - 20.7.2009, 19:38


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Leshak
Дата 20.7.2009, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 19.10.2005

Репутация: нет
Всего: нет



ksnk, 

Ух-ты!
Это уже высшая математика пошла - с ходу даже прочесть не смог.. :(

буду разбираться по слогам!
PM MAIL   Вверх
youri
Дата 20.7.2009, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: нет
Всего: 16



я имел в виду
Код

function a1( success ){
  jQuery.getJSON( Url, function(json) {
    a2(json);
    success && success();
  });
}

function a9(){
  a1(function() {
    // к этому моменту a3, a4, a5 уже выполнились
  });
}


вариант ksnk: неявная передача callback'а. Но нужно ли это в данном случае? (кто-то хочет прострелить себе ногу?) Но если очень хочется, можно тем же jQuery воспользоваться

Код

function a1( success ){
  jQuery.getJSON( Url, a2);
}

function a2() {
  ...
  $(a2).trigger('mySuperMegaEvent');
}

function a9(){
  $(a2).bind( 'mySuperMegaEvent', function() {
    // к этому моменту a3, a4, a5 уже выполнились
  } )
  a1();
}

PM   Вверх
ksnk
Дата 20.7.2009, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 38
Всего: 386



вот более корректный код. даже, вроде, работает ;-)
Код

<script>
function callAfter(x){
   var dep=window[x] && window[x].callAfter;
   while(dep && dep.length>0){
       var x=dep.pop();
       x.func.apply(this,x.arg) ;
   }
}
function setCallAfter(x,func,arg){
   var dep=window[x] && window[x].callAfter;
   if(!dep) {
       window[x].callAfter =[]; dep = window[x].callAfter;
   }
   if(func)
       dep.push({func:func,arg:arg||[]});
}
function a1(){
//   alert('a1');
    a1.resourceComplete = false;
    setTimeout(function(){
       a1.resourceComplete = true;
        window._VALUE+='a1 complete! '; 
        callAfter('a1');
    },2000);
}
function a8(arg1,arg2,arg3){
// wait till all resources complete
  if(!a1.resourceComplete) {
    setCallAfter('a1',a8,[arg1,arg2,arg3]);
    return ;
  }
   // do something
  window._VALUE+='a8 complete! '; 
  callAfter('a8');
  alert(window._VALUE); 
}


</script>
<input type="button" onclick="window._VALUE=''; a1();a8()" value="click">



Добавлено через 1 минуту и 51 секунду
youri, для этого а1 должна знать, что а2 вызвали после нее. А если не вызвали?..


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
youri
Дата 20.7.2009, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: нет
Всего: 16



Цитата(ksnk @  20.7.2009,  19:39 Найти цитируемый пост)
youri, для этого а1 должна знать, что а2 вызвали после нее. А если не вызвали?..

a1 не должна этого знать: a9 должна учитывать, что событие может не возникнуть, если произошла ошибка при выполнении ajax-запроса, но что должно происходить в случае ошибки ТС не говорил. Кроме того, твое решение - это те же события, только сформулированные в других терминах
PM   Вверх
ksnk
Дата 20.7.2009, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 38
Всего: 386



Цитата(youri @  20.7.2009,  19:59 Найти цитируемый пост)
это те же события, только сформулированные в других терминах 
 Аналогия, конечно есть, хотя можно сказать, что все программы, это те-же буквы, только по разному переставленные smile




Это сообщение отредактировал(а) ksnk - 20.7.2009, 22:06


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Применение библиотек | Следующая тема »


 




[ Время генерации скрипта: 0.0649 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.