jQuery延迟并管理代码执行顺序

时间:2011-09-07 11:11:50

标签: javascript jquery jquery-1.5 jquery-deferred

我一直在努力了解jQuery的Deferred功能的好处。如果我理解正确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 个答案:

答案 0 :(得分:1)

这对异步函数最有用。这是一个用于管理回调的实用程序类。

  

jQuery.Deferred()是一个可链接的实用程序对象,可以将多个回调注册到回调队列,调用回调队列,并中继任何同步或异步函数的成功或失败状态。

  

jQuery.Deferred()提供了提供多个回调的灵活方法,无论原始回调调度是否已经发生,都可以调用这些回调。

在异步函数中正确使用$.Deferred是在异步操作完成后返回promiseresolve延迟。

将任何值(可能是函数的结果)传递给.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) {
    // ...
});