2013-06-07 3 views
1

У меня есть что-то вроде этого:

fun1: function(){ 
    var jqXHR = $.get(
      "http://url.com", 
      "search=toto", 
      function(){}); 

    jqXHR.fail(function (jqXHR, textStatus, errorThrown){ 
     //do something 
    }); 

    jqXHR.done(function (data,textStatus,jqXHR){ 
     //do something 
    }); 
} 

fun2: function(){ 
    fun1(); 
    //do something AFTER my AJAX requests are finished 
} 

Я хочу, чтобы ждать, пока мои resquests AJAX закончены, прежде чем продолжить. Для этого я обычно использовал функцию обратного вызова в fun1(). Но мой код теперь содержит несколько уровней обратных вызовов, и это выглядит беспорядочно. Тогда я хотел бы использовать метод $.when, но я не знаю, как это сделать: в fun1 не отложенный объект, я не могу просто написать:

$.when(fun1()).then(//do something); 
+0

Вы посмотрели примеры на http://api.jquery.com/jQuery.when/? –

ответ

5

$.when в основном используется, когда вы ждете несколько обещаний. Похоже, вам это не нужно в вашей ситуации.

Здесь вы просто должны вернуть jqXHR объект из функции:

fun1: function (foo){ 
    // ... 
    return jqXHR; 
} 

fun2: function() { 
    fun1().then(function() { 
     // ... 
    }); 
} 

Объекта возвращаемого $.get реализует интерфейс обещания, так что вы можете сразу прикрепить обратные вызовы к нему. В документации также приводится несколько примеров: http://api.jquery.com/jQuery.get/.

3

Вам необходимо вернуть объект с отсрочкой (или, что еще лучше, promise()) от fun1().

В противном случае вы не сможете узнать, когда он будет готов.

Как только вы это сделаете, вам не нужно использовать acll $.when(); вместо этого вы можете просто позвонить fun1().then(...)

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