jQuery Deferred

igortik

Новичок
Есть функция, которая должна вернуть результат в виде, например, значения, которое она определяет, исходя из данных полученных AJAX запросом:

PHP:
function myFunction(){
 var completeResult;
 var myUrl = 'some url';
 
 // Request
 var jqxhr = $.get(myUrl,function( result ){
  completeResult = result;
 });

 $.when(jqxhr).then(function(){
   return completeResult; // Неверная конструкция!
 });
 return completeResult;
}
Беда в том, что return основной функции вызывается до того, как выполнится $.when().then() И переменная completeResult попросту не успевает наполниться необходимым значением.
А ведь есть еще и клиентский код для данного кода, который также должен выждать, получить ответ от myFunction() и продолжить свою работу с данными completeResult.

Кто сталкивался? Как быть?
 

Ярослав

Новичок
Использовать калбеки или дополнительные пользовательские эвенты?

PHP:
function myFunction(callbackFn) {
    ...
    // Request
    var jqxhr = $.get(myUrl,function( result ){
        callbackFn(result);
    });
}

myFunction(function(completeResult) {
    alert(completeResult);
});
 

igortik

Новичок
Ярослав
Пришлось таким путем и пойти :/
Явно объявляю метод в .complete(function(){})
и там вызываю функцию обратного вызова ...

Пробовал делать в .complete() нечто: $(this).data('myData',myData), а потом в клиентском коде, дожидаясь успешного JSONP завершения, обратиться обратно к $(this).data('myData'), но почему-то безуспешно.. ставил даже явный setTimeout() для клиентского кода.. но, видать, или сам что-то с областью видимости напутал, либо, в .complete() нельзя делать такие трюки..

p.s. до этого проблем с $(this).data('myData',myData) в плагине не было и нет на данный момент.

В общем, спасибо :) callback - по-моему, единственное решение на данный момент.
 
Сверху