jQuery Deferreds и управление порядком выполнения кода

Я пытался понять преимущества отложенной функциональности jQuery. Если я правильно понимаю, Deferred не предлагает альтернативу обратным вызовам, а предлагает лучшее управление обратными вызовами? Если я пишу метод и хочу убедиться, что он завершил выполнение, прежде чем запускать другую задачу, мне все равно понадобится обратный вызов, чтобы установить deferred.resolve? Вот пример кода, иллюстрирующий то, что я считаю правильным:

Это родительская функция. Я хочу убедиться, что 'AddItemsToList' завершен, прежде чем я выберу значение по умолчанию. (Это не настоящая функция, просто пример).

function PopulateListAndSelectDefault(list,default)
{
   var resultObject = AddItemsToList($('#myList'), list);

   successObject.Success(function(){
      SelectItemInList($('#myList'), default);
   });
}

Это был бы неправильный способ написания функции 'AddItemsToList':

function AddItemsToList (jquerySelectList,items)
{
   var result= $.Deferred();
   $.each(items, function (i, _property) 
   {
      if (CheckElementIsSelectList(_property.Value)) 
      {
          jQueryListItem.append($("<option></option>").attr("value", _property.value).text(_property.DisplayText)); //Add Item
      }
   }
   result.resolve;
   return result;      
}

Вместо этого правильным способом было бы продолжать использовать обратный вызов, но на этот раз только разрешать отложенный объект, чтобы я мог позже прикрепить дополнительные методы успеха/неудачи, если я того пожелаю?

Я правильно понял? Как правильно написать приведенный выше код, или я совершенно неправильно понял основы? Заранее спасибо.


person Damien    schedule 07.09.2011    source источник


Ответы (1)


Это наиболее полезно для асинхронных функций. Это служебный класс для управления обратными вызовами.

jQuery.Deferred() — это служебный объект с возможностью цепочки, который может регистрировать несколько обратных вызовов в очередях обратных вызовов, вызывать очереди обратных вызовов и передавать состояние успеха или отказа любой синхронной или асинхронной функции.

   

jQuery.Deferred() предоставляет гибкие способы предоставления нескольких обратных вызовов, и эти обратные вызовы могут быть вызваны независимо от того, произошла ли уже исходная отправка обратного вызова.

Правильное использование $.Deferred в асинхронной функции должно возвращать promise и resolve Отложено после выполнения асинхронной операции.

Передайте любое значение (возможно, результат функции) в .resolve(), и зарегистрированные обратные вызовы получат это значение.

Пример:

function getSomething() {
    var deferred = new $.Deferred;
    $.get('/get-something', function(data) {
        deferred.resolve(data);
    });
    return deferred.promise();
}

myAsynchronousFunction().done(function(data) {
    // ...
});

В данном случае это эквивалентно:

function getSomething(callback) {
    $.get('/get-something', function(data) {
        callback(data);
    });
}

myAsynchronousFunction(function(data) {
    // ...
});
person Arnaud Le Blanc    schedule 07.09.2011