Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Очередь ajax-запросов и deferred-объекты (https://javascript.ru/forum/jquery/29663-ochered-ajax-zaprosov-i-deferred-obekty.html)

Epolypero 06.07.2012 15:06

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

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

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


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

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

Спасибо за внимание, надеюсь, что натолкнете на мысль.

Deff 06.07.2012 17:54

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

Epolypero 06.07.2012 23:40

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

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

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

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


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

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

А вы код на gist вообще смотрели? Там вроде типа того и написано.

Deff 06.07.2012 23:53

Цитата:

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

Завтра нарисую

Deff 07.07.2012 12:14

Цитата:

Сообщение от Epolypero
у меня никогда не выводится "Я исчерпал попытки, хозяин",

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

Epolypero 07.07.2012 12:42

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

Вся фишка была в передаче dfd в новую задачу.

Deff 07.07.2012 12:54

Epolypero,
Цитата:

Сообщение от Deff
есть еще нюанс - но позже

В конец запрашиваемого адреса , стоит поставить
base_url=base_url+'?'+Math.random();
Посколь в Ие повторные запросы (а это востребовано при меняющемся контенте) безбожно кешируются

Epolypero 07.07.2012 13:29

У $.ajax уже стоит cache: false, или я что-то не понял?

Deff 07.07.2012 13:31

в старых Ие (до 8)
Цитата:

Сообщение от Epolypero
cache: false

не срабатывает если параллельно не стоит и в PHP на сервере

Epolypero 07.07.2012 13:33

Цитата:

Сообщение от Deff (Сообщение 187000)
в старых Ие (до 8) не срабатывает если параллельно не стоит и в PHP на сервере

Я не использую PHP, я Django-программист.


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