Javascript.RU

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

Очередь ajax-запросов и deferred-объекты
Мне требуется реализовать функцию, которая через определенные промежутки времени опрашивает url (обязательно нужна очередь ajax-запросов), до тех пор, пока не кончится число попыток, либо не будет возвращен корректный ответ.

Вот так я себе представляю работу с функцией:

GetTask('somtask_id', {repeat: 2, delay: 500})
    .done(function(task){ console.log('Задача готова'); })
    .fail(function(){ console.log('Я исчерпал попытки, хозяин'); });


Для реализации очереди я использую $.ajaxQueue. Несмотря на то, что я вообще плохо понимаю, как работать с очередями в jQuery, я написал следующий код.

Проблема в том, что у меня никогда не выводится "Я исчерпал попытки, хозяин", а я в упор не понимаю, как это сделать.

Спасибо за внимание, надеюсь, что натолкнете на мысль.
Ответить с цитированием
  #2 (permalink)  
Старый 06.07.2012, 16:54
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,220

Epolypero,
не наю чот сложно всё - вот Аякс http://jquery-docs.ru/Ajax/jQuery.ajax/#options
можно как неудачные попытки считывать
так и удачные
- неудачные см error http://jquery-docs.ru/Ajax/jQuery.ajax/#toptions
считываете в глобальную переменную неудачные и обнуляете её при удачных, для очереди - при любом исходе(с проверкой флага удачности) запускаете по концу предыдущего запроса-следущий( желательно через таймер с маленькой задержкой, аргументы для запуска следующего запроса берете из стека(заготовленного ранее) аргументов.
Ответить с цитированием
  #3 (permalink)  
Старый 06.07.2012, 22:40
Новичок на форуме
Отправить личное сообщение для Epolypero Посмотреть профиль Найти все сообщения от Epolypero
 
Регистрация: 06.07.2012
Сообщений: 5

> до тех пор, пока не кончится число попыток, либо не будет возвращен корректный ответ.

Под корректным ответом я имею ввиду не плохой ответ сервера, а вот что:

var req = $.ajax({...,
  success: function(data){
    if (!data['is_ready']){
       // Тут надо сделать магию, читайте ниже
    }
  }
});

$.when(req).fail(function(){ 
  alert('Если вы это видите, магия произошла!'); 
});


Возможно ли это вообще?

> исходе(с проверкой флага удачности) запускаете по концу предыдущего запроса-следущий( желательно через таймер с маленькой задержкой, аргументы для запуска следующего запроса берете из стека(заготовленного ранее) аргументов.

А вы код на gist вообще смотрели? Там вроде типа того и написано.
Ответить с цитированием
  #4 (permalink)  
Старый 06.07.2012, 22:53
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,220

Сообщение от Epolypero
Возможно ли это вообще?
Завтра нарисую

Последний раз редактировалось Deff, 07.07.2012 в 11:14.
Ответить с цитированием
  #5 (permalink)  
Старый 07.07.2012, 11:14
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,220

Сообщение от Epolypero
у меня никогда не выводится "Я исчерпал попытки, хозяин",
Пробуйте вставить адрес запроса с другого домена - тогда должна вернуться ошибка, если код верен - должны получить эту строку: 'Я исчерпал '
есть еще нюанс - но позже

Последний раз редактировалось Deff, 07.07.2012 в 11:18.
Ответить с цитированием
  #6 (permalink)  
Старый 07.07.2012, 11:42
Новичок на форуме
Отправить личное сообщение для Epolypero Посмотреть профиль Найти все сообщения от Epolypero
 
Регистрация: 06.07.2012
Сообщений: 5

У меня получилось решить задачу, код можно глядеть тут:
https://gist.github.com/3059545

Вся фишка была в передаче dfd в новую задачу.
Ответить с цитированием
  #7 (permalink)  
Старый 07.07.2012, 11:54
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,220

Epolypero,
Сообщение от Deff
есть еще нюанс - но позже
В конец запрашиваемого адреса , стоит поставить
base_url=base_url+'?'+Math.random();
Посколь в Ие повторные запросы (а это востребовано при меняющемся контенте) безбожно кешируются
Ответить с цитированием
  #8 (permalink)  
Старый 07.07.2012, 12:29
Новичок на форуме
Отправить личное сообщение для Epolypero Посмотреть профиль Найти все сообщения от Epolypero
 
Регистрация: 06.07.2012
Сообщений: 5

У $.ajax уже стоит cache: false, или я что-то не понял?
Ответить с цитированием
  #9 (permalink)  
Старый 07.07.2012, 12:31
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,220

в старых Ие (до 8)
Сообщение от Epolypero
cache: false
не срабатывает если параллельно не стоит и в PHP на сервере
Ответить с цитированием
  #10 (permalink)  
Старый 07.07.2012, 12:33
Новичок на форуме
Отправить личное сообщение для Epolypero Посмотреть профиль Найти все сообщения от Epolypero
 
Регистрация: 06.07.2012
Сообщений: 5

Сообщение от Deff Посмотреть сообщение
в старых Ие (до 8) не срабатывает если параллельно не стоит и в PHP на сервере
Я не использую PHP, я Django-программист.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PHP: несколько AJAX запросов с долговременной обработкой на сервере FINoM Серверные языки и технологии 9 20.03.2012 17:50
Очередь XML запросов Евгений М AJAX и COMET 4 01.02.2012 09:05
Одновременное количество AJAX запросов decadent AJAX и COMET 18 03.06.2011 17:16
Отследить окончание нескольких ajax запросов mikel AJAX и COMET 2 11.03.2011 16:14
Асинхронный ajax запрос ставится в очередь ring AJAX и COMET 2 08.02.2011 16:47