jQuery推迟了优势?

时间:2011-11-06 20:41:19

标签: jquery

 $.ajax("example.php").done(function ()
 {
     alert(...);
 }).fail(function ()
 {
     alert(...);
 }).always(function ()
 {
      alert(...);
 });

VS

  $.ajax("example.php",

      success: function ()
      {
          alert('');
      },
      error: function ()
      {
          alert('');
      },
      complete: function ()
      {
          alert('');
      }
  );

抱歉, 看到任何优势

你能解释一下吗?

或者你可以给我示例前者不能由后者完成......?

3 个答案:

答案 0 :(得分:5)

对于初学者来说,第二个代码块甚至在语法上都没有效。我称之为第一个:P

的优势

但严肃地说:

这只是实现相同最终结果的不同语法。一个直接的优势是你可以为延迟的每个结果连接多个函数:

$.get("example.php").done(function ()
{
    alert("success 1");
}).done(function ()
{
    alert("success 2");
});

否则你必须这样做:

function done1()
{
    alert('success 1');
}
function done2()
{
    alert('success 2');
}

$.ajax('example.php',
{
    success: function ()
    {
        done1.apply(this, arguments);
        done2.apply(this, arguments);
    }
});

引自How can jQuery deferred be used?

的其他优点
  
      
  • 当任务可能会或可能不会异步运行时,延迟是完美的,并且您希望从代码中抽象出这个条件。
  •   
  • ...从多个来源获取数据。在下面的示例中,我将获取现有应用程序中使用的多个独立JSON模式对象,以便在客户端和REST服务器之间进行验证。在这种情况下,我不希望浏览器端应用程序在加载所有模式之前开始加载数据。 $ .when.apply()。then()非常适合这个。
  •   
  • 可以使用延迟代替互斥锁。这与多个ajax使用场景基本相同。
  •   

答案 1 :(得分:4)

我认为延迟对象只是jQuery演变的另一个步骤。

在它们之前,只能将回调传递给配置对象中的$.ajax。有了deferrds,您现在可以使用它们处理所有异步甚至同步执行,从而实现更统一的界面。这是优势:简化统一

引入on时发生了类似的事情。 on优于bind,但它简化了事件处理,因为它结合了bindlivedelegate的功能。结果是用于事件处理的统一API。要么我使用相同功能的两倍on,要么binddelegate

以类似的方式,如果我想进行两次相关的Ajax调用,我可以使用两个$.ajax调用加上$.when,这是我所熟悉的并且没有任何不同进行一次或多次调用,或者我将一个调用嵌套在另一个调用中,这需要我对执行的执行方式进行不同的思考。

延迟对象是异步代码执行的统一通用方法。这并不意味着应该删除之前添加回调的方法,这会破坏很多代码。除此之外,它仍然更接近原始XMLHTTPRequest对象的方法,有些人可能更喜欢这些方法。

答案 2 :(得分:1)

延迟对象的主要好处是你可以传递它们,所以对于复杂的情况,ajax执行代码不知道还有谁对回调感兴趣,或者你不想对它进行硬编码,它只能传递给它延迟对象到感兴趣的插件/模块代码。

e.g。

var defer = $.get("example.php");
for(var i=0; i<ajax_observers.length;i++){
    ajax_observers[i].hook(defer)
}

同样的事情可以通过回调来完成,但是你必须编写一个接口来从观察者那里获得回调函数,这是不灵活的,延迟观察者可以对延迟对象做任何事情。