Функция обратного вызова внутри объектов Deferred

Я пытаюсь следовать некоторым урокам javascript, где есть реализация Deferred. Это ядро ​​кода

getData = function (options) {
  return $.Deferred(function (def) {

    var results = options.results;                    

    getFunction({
      success: function (smt) {                                
        results("test");
        def.resolve(results);
        debugger;
      },
      error: function (response) {                                    
        def.reject();
      }
    }); 

  }).promise();
},

Теперь вопрос в том, когда я вызываю эту функцию извне, например:

$.when(somthing.getData(options)).
   done(alert(options.results));

debugger;

Бывает, что СНАЧАЛА доберитесь до отладчика вне вызова $.when, а ЗАТЕМ коснитесь внутренней функции обратного вызова SUCCESS внутри объекта Deferred...

Я не понимаю... разве обещание не должно выполняться только при достижении def.resolve(results)?...


person Ivan_nn2    schedule 05.03.2013    source источник


Ответы (1)


Все верно, кроме последней строчки:

$.when(somthing.getData(options)).done(alert(options.results));
debugger;

Вы звоните alert ( и debugger ) немедленно сюда. Что вы хотите, так это передать обратный вызов done следующим образом:

$.when(somthing.getData(options))
.done(function(){
    alert(options.results);
    debugger;
});
person freakish    schedule 05.03.2013
comment
Слава богу.. это сработало как шарм.. Могу я спросить вас, почему?.. Я думал, что функция внутри DONE уже была функцией обратного вызова... почему я должен определять такую ​​​​функцию, чтобы вызвать мою функцию?. .. - person Ivan_nn2; 05.03.2013
comment
.done принимает функцию. То, что вы передали .done, не является функцией, а результатом вызова alert() (обратите внимание на порядок: сначала вызывается предупреждение, затем его результат передается .done), который не определен (это то, что возвращает предупреждение). Это как делать .done("test"). Что это значит? Что JavaScript должен делать со строкой? Вы хотите передать функцию .done, чтобы JavaScript знал: о, я получил функцию, я могу вызвать ее, как только when будет выполнено. - person freakish; 05.03.2013