Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.07.2014, 01:38
Новичок на форуме
Отправить личное сообщение для dmsuslov Посмотреть профиль Найти все сообщения от dmsuslov
 
Регистрация: 28.10.2007
Сообщений: 8

AJAX и Deferred: последовательность выполнения обработчиков
Задача: получить данные с сервера посредством $.post, обработать их в методе .success(), после чего вызвать определенную функцию.

var t;
        $.when($.post("get_json.php", function(res) {
          t = res;
        }, 'json')).done(function() {
          console.log(t);
        });


Правильно ли я понимаю, что Deferred-метод .done() выполнится после того, как отработает .success (т.е. t = res) ?
Но почему тогда console.log(t) выводит "undefined"?
Получается, что .done() срабатывает сразу после выполнения запроса, но до выполнения .success()?
Ответить с цитированием
  #2 (permalink)  
Старый 28.07.2014, 01:56
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Возможно, проблема в том, что $.post возвращает не промис, а jqXHR. В результате $.then() успешно разрешается этим объектом. Думаю, тут надо как-то так:

var t;
	$.when($.post("get_json.php", function(res) {
		t = res;
	}, 'json').promise()).done(function() {
		console.log(t);
	});


Кстати, зачем нужно делать такой каскад: коллбэк, затем промис? Ведь в done результат тоже приходит, безо всяких переменных в замыкании.

Последний раз редактировалось ixth, 28.07.2014 в 01:59.
Ответить с цитированием
  #3 (permalink)  
Старый 30.07.2014, 17:32
Новичок на форуме
Отправить личное сообщение для dmsuslov Посмотреть профиль Найти все сообщения от dmsuslov
 
Регистрация: 28.10.2007
Сообщений: 8

Посыпаю голову пеплом! Оказывается, мой пример - рабочий :-)

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

В реальном коде у меня была допущена ошибка, .done() был таким:

.done(console.log(t));


В то время, как здесь я запостил его в правильном виде:

.done(function () {console.log(t)});


И, разумеется, console.log(t) выполнялся тут же, не дожидаясь обработки событий.

А такой каскад обработчиков нужен был вот для чего. $.post()-запросов было несколько, и в .success() каждого запроса происходила обработка полученного результата. И уже по факту завершения последнего запроса вызывался окончательный обработчик .done(), который пользовался результатами работы .success() каждого запроса.

.promise() оказался ненужным. Документация (http://api.jquery.com/jquery.post/) гласит следующее:

As of jQuery 1.5, all of jQuery's Ajax methods return a superset of the XMLHTTPRequest object. This jQuery XHR object, or "jqXHR," returned by $.get() implements the Promise interface, giving it all the properties, methods, and behavior of a Promise (see Deferred object for more information).


Но всё равно большое спасибо за отзыв!
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Последовательность выполнения кода Makeda Общие вопросы Javascript 1 16.06.2014 14:35
Последовательность выполнения кода Makeda Общие вопросы Javascript 0 16.06.2014 13:59
Книги по Ajax BaVa Учебные материалы 18 18.08.2013 14:05
Последовательность выполнения функций nematod Общие вопросы Javascript 7 25.02.2011 03:16
Последовательность выполнения в динамическом js sovka Общие вопросы Javascript 2 18.10.2008 15:58