jQuery « jQuery.Deferred

Помогите разобраться с $.Deferred, пожалуйста. Видимо, я не до конца понимаю как это работает.

Есть код следующего вида:

/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .javascript.geshi_code {font-family:monospace;} .javascript.geshi_code .imp {font-weight: bold; color: red;} .javascript.geshi_code .kw1 {color: #000066; font-weight: bold;} .javascript.geshi_code .kw2 {color: #003366; font-weight: bold;} .javascript.geshi_code .kw3 {color: #000066;} .javascript.geshi_code .co1 {color: #006600; font-style: italic;} .javascript.geshi_code .co2 {color: #009966; font-style: italic;} .javascript.geshi_code .coMULTI {color: #006600; font-style: italic;} .javascript.geshi_code .es0 {color: #000099; font-weight: bold;} .javascript.geshi_code .br0 {color: #009900;} .javascript.geshi_code .sy0 {color: #339933;} .javascript.geshi_code .st0 {color: #3366CC;} .javascript.geshi_code .nu0 {color: #CC0000;} .javascript.geshi_code .me1 {color: #660066;} .javascript.geshi_code span.xtra { display:block; }
function hide() {
    var dfd = $.Deferred;
   
    box.fadeOut(function(){
      dfd.resolve();
    });

    return dfd.promise();
}

function show() {
  box.fadeIn();
}

button.on('click', function(){
  $.when(hide).then(show);
});


Как я думаю это должно работать:
В hide() создается deferred объект, promise объект из которого возвращается после исполнения hide().
При срабатывании события click на button функция show() будет выполнена как doneCallback dfd после того как он станет "resolved"

Но так не работает. Где ошибка в моих ожиданиях? =)

1 ответов


Сам спросил, сам ответил.
Ошибки в ожиданиях нет. Есть ошибка в передаче параметров в $.when().
Передавать в нее нужно не функцию, а deferred. То есть правильный вариант такой:

button.on('click', function(){
  $.when(hide()).then(show);
});