2015-02-14 2 views
-3

Цепной два $ .ajax() вызова следующим образом:Удивляет поведение .ajax() обещает в JQuery

[EXAMPLE 1] 
var promise1 = $.ajax({url: remoteUrl, type: 'POST'}); 
promise1.then(
    function() { 
     $.ajax({url: remoteUrl}); 
    } 
); 

производит на удаленном сервере, как и ожидалось, следующие события:

ENTER api_ping() ... 
. 
. 
. 
leave api_ping() ... 
ENTER api_ping() ... 
. 
. 
. 
leave api_ping() ... 

Однако, используя следующий простой синтаксис:

[EXAMPLE 2] 
var promise1 = $.ajax({url: remoteUrl, type: 'POST'}); 
promise1.then(
    $.ajax({url: remoteUrl}) 
); 

секвенциальности теряется:

ENTER api_ping() ... 
. 
ENTER api_ping() ... 
. 
. 
. 
leave api_ping() ... 
leave api_ping() ... 

с моим большим удивлением, поскольку .then() является цепным и возвращает новое обещание.

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

Однако происходят более странные вещи. При использовании GET вместо POST, следующим образом:

[EXAMPLE 3] 
var promise1 = $.ajax({url: remoteUrl, type: 'GET'}); 
promise1.then(
    $.ajax({url: remoteUrl}) 
); 

оригинал «правильное» поведение восстанавливается:

ENTER api_ping() ... 
. 
. 
. 
leave api_ping() ... 
ENTER api_ping() ... 
. 
. 
. 
leave api_ping() ... 

Я пытаюсь выяснить, разумное объяснение для этого ... предложения?

+1

вы выполняете функцию сразу в вашем 2-ом примере. –

+0

Тем не менее, это не объясняет третий пример: тот же синтаксис, различное поведение –

+0

браузер (или сервер) должен сериализовать запрос GET на тот же uri, чтобы он мог повторно использовать кеш (если это возможно) или другое поведение браузера/сервера. –

ответ

1

Вы выполняете функцию сразу в своем втором примере.

В вашем третьем примере браузер (или сервер) должен сериализовать запрос GET на тот же uri, чтобы он мог повторно использовать кеш (если это возможно) или другое поведение браузера/сервера.

, если вы хотите, чтобы держать вещи ясно я думаю вы можете сделать:

var someUpdate1 = function() { 
    return $.ajax({url: remoteUrl}); 
} 
var someUpdate2 = function() { 
    return $.ajax({url: remoteUrl}); 
} 

var updates = someUpdate1 
       .then(someUpdate2) 
       .then(...); 
+0

Вот и все! хороший улов –

1

Это из-за синтаксиса и правил оценки Javascript. Во втором примере вызывается $.ajax({url: remoteUrl}) и его возвращаемое значение передается в promise1.then().

Когда $.ajax() возвращает его уже отправил запрос.

Что касается времени событий на сервере, то кажется, что запрос GET немного быстрее обрабатывается вашим сервером в этом случае, так что они выполняются последовательно на сервере (сервер заканчивает отвечать перед началом обработка следующего запроса GET, постукивающего дверью). Это только случайность; с достаточным количеством повторных попыток вы также можете запустить их одновременно.

Что касается последнего шаблона, то можно было бы иметь такую ​​функцию, как $.ajax, которая вернет функцию отложенной функции, которая будет вызываться при вызове then, но почему? «Шаблон», который вы используете, на самом деле не является шаблоном, не многие реальные программы должны запускать постоянные запросы AJAX в режиме занятости.

+0

Спасибо. Однако я все еще смущен. В третьем примере используется тот же синтаксис; однако второй вызов ajax выполняется только после того, как первое обещание было разрешено. –

+0

Для обоих GET и POST сервер отправляет ответ только через 10 секунд, , чтобы убедиться, что не возникли ситуации спешки. Таким образом, я могу смело заключить различное поведение КЛИЕНТА в двух случаях, просмотрев временные метки в журнале доступа к веб-серверу: с GET: [14/Feb/2015: 09: 14: 16 +0100] " GET/api/ping/HTTP/1.1 "200 108 [14/Feb/2015: 09: 14: 26 +0100]" GET/api/ping/HTTP/1.1 "200 108 с POST: [14/Feb/2015: 09: 15: 38 +0100] «POST/api/ping/HTTP/1.1» 200 108 [14/Feb/2015: 09: 15: 38 +0100] «GET/api/ping/HTTP /1.1 "200 108 –

+0

у вас одновременно есть 2 POST –

Смежные вопросы