Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2012, 22:29   #1
NidHelp
 
Регистрация: 19.09.2011
Сообщений: 7
По умолчанию Ajax+PHP. Цикличные запросы.

Будьте добры, помогите советом, как лучше реализовать эту связку ajax и php.

Необходимо выводить небольшие блоки на сайт, 20-30 на страницу. НО. Каждый последующий блок выводится на основе обработанной скриптом информации о предыдущем.

Если всё это удовольствие зациклить, то, насколько понимаю, сами запросы начинают выполняются с неконтролируемой скоростью, не синхронно и не пошагово.

То есть нужно: ajax-запрос -> вывод на экран -> получение параметров этого нового DOM-объекта -> и только после этого новый ajax-запрос на основании полученных данных.

Как оказалось, проблема с таким циклом. Что очень странно. Вроде ничего в нем замудреного нет.

Последний раз редактировалось NidHelp; 13.08.2012 в 06:58.
NidHelp вне форума Ответить с цитированием
Старый 13.08.2012, 02:26   #2
NidHelp
 
Регистрация: 19.09.2011
Сообщений: 7
По умолчанию

Проблему решил, но частично.

Код:
function ajax_loop(){
  if (cnt!=20) {
    $.get('php/my.php', { d1:x },
      function(data) { $("#id").append(data); }).done( function(){
        // Здесь необходимые вычисления. 
        x=x+100500;
        // В конце рекурсивный вызов функции
        cnt++;
        ajax_loop(x) } );
  }
}
Иногда цикл проскакивает, минуя все вычисления. То есть, опережает, не дожидается отображения объекта в браузере, и передает данные, полученные шагом раньше. Есть ли возможность это всё синхронизировать, чтобы запросы не убегали вперед?

Последний раз редактировалось NidHelp; 13.08.2012 в 06:50.
NidHelp вне форума Ответить с цитированием
Старый 13.08.2012, 09:23   #3
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

засунь вычисления в кол-бэк
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 13.08.2012, 10:26   #4
NidHelp
 
Регистрация: 19.09.2011
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Naive Посмотреть сообщение
засунь вычисления в кол-бэк
Собственно сперва тоже так и решил, что будет достаточно. В стандартный success: аякса все вычисления. Но в цикле это, увы, не работает. Даже на экран не выводит объекты, сразу переходит к следующему запросу, цикл "вешается".

Прикрутив .done к функции, более-менее всё стало, но тоже раз на раз не приходится. Следовательно, всё равно каждый шаг цикла стартует не при условии получения параметров DOM-объекта.

Последний раз редактировалось NidHelp; 13.08.2012 в 10:39.
NidHelp вне форума Ответить с цитированием
Старый 13.08.2012, 11:34   #5
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Код:
ajax_loop(x) // тут вы передаете x
function ajax_loop(){ // а тут не принимаете
Да и рекурсия в данном случае не оправдана, если конечно вам не нужен строгий порядок полученных данных, но это будет выполняться дольше.
Оптимальней было бы так:
Код:
function ajax_loop(){
  for (var x=0, cnt=20;cnt--;x+=100500) {
    $.get('php/my.php', { d1:x },
      function(data) { $("#id").append(data); });
  }
}
Если нужен порядок, то можно отслеживать его, но не ставить запросы в очередь:
Запуск аякса отрабатывает в сотни раз быстрее, чем ожидание ответа сервера, так что лучше послать 20 запросов и потом собирать в нужные места 20 ответов, чем слать их по очереди.
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 13.08.2012, 20:23   #6
NidHelp
 
Регистрация: 19.09.2011
Сообщений: 7
По умолчанию

Спасибо.

Да, в итоге пришлось отказаться вообще от затеи с цикличными аяксами, нецелесообразно. Тем более если потребуется не 20 проходов цикла, а 50, 100, 200. Запрос сделал 1. И вывод контента сперва происходит в блок position:absolute; left-margin:-3000. И потом уже оттуда дивы с необходимыми изменениями помещаются скриптом в видимую область экрана.
NidHelp вне форума Ответить с цитированием
Старый 14.08.2012, 09:39   #7
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Цитата:
И вывод контента сперва происходит в блок position:absolute; left-margin:-3000. И потом уже оттуда дивы с необходимыми изменениями помещаются скриптом в видимую область экрана.
Зачем? Работа с dom тоже небыстрая операция, лучше генерируйте объекты и обращайтесь к ним по ссылкам (js-указателям).
Alar, верни репу!
Naive вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ajax jquery php gunsoy JavaScript, Ajax 17 13.01.2014 14:33
AJAX + PHP errload JavaScript, Ajax 11 19.05.2012 02:40
Задачи по темам: текстовие файли, цикличные структуры Federer Помощь студентам 1 17.05.2012 19:18
AJAX + PHP mar4elo JavaScript, Ajax 8 12.10.2011 14:24