Имя: Пароль:
IT
Веб-мастеринг
Как запустить последовательно 2-а и более AJAX-а
,
0 План счетов
 
10.01.14
14:12
Как запустить 2 и более аякса, чтоб второй запустился когда ВЫПОЛНЕНИЕ первого завершится и т.д.
?
1 План счетов
 
10.01.14
14:19
можно конечно запускать при выполнении:
if (req.readyState == 4){                
   if(req.status==200){  

Но такой вариант не хочу использовать, т.к. кол-во запусков аяксов заранее не известно, хочется сделать более универсальное, отправить массив параметров и получить последовательное выполнение аяксов.
2 Asmody
 
10.01.14
14:21
на чистом javascript?
3 План счетов
 
10.01.14
14:28
(2) Да скрипт в файле ajax_tooltip.js
есть скрипты которые прописаны в PHP и меняются, но аяксовый скрипт хочу чтоб был на чистом javascript
4 acsent
 
10.01.14
14:30
а по порядку запустить разве не прокатит? или они асинхронно вызываются?
5 План счетов
 
10.01.14
14:33
(4) второй добавляет данные в форму которую вернул первый аякс. Бывает так что первый затормозил, а второй уже выполнил и вернуть (вставить) данные ему некуда.
6 Asmody
 
10.01.14
14:42
в общем случае как-то так:

req.onreadystatechange = function() {
if(req.readyState == 4) {
  /** тут новый запрос **/
}}
7 План счетов
 
10.01.14
14:46
(6) да так умею, и так работает.
Хотелось сделать более универсально.

х.з. наверно попробую сделать скрытый атрибут который будет заполнятся первым аяксом, и чтоб второй аякс его проверял, если этот атрибут заполнен то значит первый аякс уже отработал и можно запускать второй, и т.д.
8 kokamoonga
 
10.01.14
19:52
(7) что мешает стандартный ajax-вызов завернуть в функцию и в callback'е вызывать ее рекурсивно? Если хочется массив с параметрами, то вобщем тоже решений больше чем одно. Прямо в лоб - передаешь в функцию массив с параметрами вызовов и индекс, по условию выполнения в callback'е заново вызываешь ту же функцию с новым значением индекса.

Что-то типа:

function ajax_chaining(params, step) {

    req = $.ajax(params[step]); //псевдокод, создаешь объект XmlHttpRequest любым удобным способом.
    
    req.onreadystatechange = function () {
        if (req.readyState == 4) {
            
            /* действия с результатом запроса */

            if (step+1 < params.length && some_statement) {
                ajax_chaining(params, step+1);    
            }
        }
    }
}


То есть задача решаема, но мне кажется это плохое решение. Раз уж сервер знает как отрабатывать эту цепочку вызовов, может ему сразу все параметры и отгрузить? Оправданным решение на клиенте может быть только в случае очень длинной цепочки с большим количеством данных.
9 Torquader
 
11.01.14
01:58
(8) На самом деле, цепочка вызовов нужна только тогда, когда новые данные для передачи на сервер появляются в процессе обмена с сервером - то есть "зверь" что-то "мышнул" на форме - запрос полетел на сервер, а "зверь" продолжает "мышковать", и новые запросы собираются в буфер, чтобы быть отправленными на сервер сразу после окончания обработки предыдущего запроса.

Ну, ещё полезно почитать про Web-Socket и как оно должно работать, чтобы иметь двунаправленный канал.
10 sda553
 
11.01.14
02:07
Создать объект, на каждый вызов. В нем одна из переменных хранит нужный колбэк, другая переменная содержит указатель на следующий объект. В этом объекте метод, работающий по схеме (6) по завершению метода вызывается похожий метод из следующего объекта.

Объекты инициализируем в массив
11 kokamoonga
 
11.01.14
02:40
(9) ну для описанной ситуации цепочки ajax-запросов имхо плохой выбор. WebSocket да, ну или что-то из костылей типа socket.io. ajax'ом очень накладно
12 artist
 
11.01.14
03:50
Как вариант - задействовать jQuery с его аяксом, у него уже есть готовые callback'и для успешного, неуспешного и любого завершения запроса...
13 Torquader
 
11.01.14
12:25
А повторное использование объекта xmlhttprequest, насколько я помню, никто не отменял - и в случае keep-alive запрос в том же канале пойдёт.
14 kokamoonga
 
11.01.14
16:37
(13)  long-polling/comet же, это туда же, в раздел костылей к socket.io.
15 mrkorn
 
13.01.14
09:23
(7) рекурсивный вызов универсальнее и логичнее в этом случае.
Если форма добавляется в DOM можно отследить это событие через DOM MutationObserver.

вот статья на тему http://habrahabr.ru/post/202366/
16 План счетов
 
13.01.14
09:39
Да, позже размышляя пришел к выводу, что рекурсией будет правильнее.

(7)>>Раз уж сервер знает как отрабатывать эту цепочку вызовов, может ему сразу все параметры и отгрузить?

Надо попробовать и так, вроде должно не сложно получится. Передать параметры и ID куда это должно будет вставлено. Сервер обработает, вернет, я останется только подставлять данные.

Картинка реализации проясняется.
17 kokamoonga
 
13.01.14
10:00
(16) если логика немного сложнее, чем 200 строк кода и три функции, то, возможно, имеет смысл подумать о Pub/Sub.
18 План счетов
 
14.01.14
09:49
Рекурсия прекрасно отрабатывает, все что хотел получил.

Всем спасибо.
19 Torquader
 
15.01.14
13:08
(16) Если в ответ сервера включать информацию о том, что с ответом нужно сделать, то можно смело отправлять пакет запросов, если нет, то придётся писать парсер ответа, который разнесёт части ответа в вызывающие функции.
В принципе, написать не сложно, но делить один ответ на несколько - непросто.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.