jQuery откладывает и управляет порядком выполнения кода - PullRequest
1 голос
/ 07 сентября 2011

Я пытался понять преимущества отложенной функциональности 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;      
}

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

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

1 Ответ

1 голос
/ 07 сентября 2011

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

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) {
    // ...
});
...