2011-11-06 126 views
9
$.ajax("example.php").done(function() 
{ 
    alert(...); 
}).fail(function() 
{ 
    alert(...); 
}).always(function() 
{ 
     alert(...); 
}); 

VSjQuery推迟优势?

$.ajax("example.php", 

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

对不起,我不能看不到任何优势

能否请您解释一下吗?

或者也许你可以给我例子的前者不能由后者完成...?

+2

耸耸肩......我想前者可能会感觉更多的jQuery-y。我认为这不仅仅是一种文体上的优势。 –

回答

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?

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

仍然很难看到任何区别。因为当即时通讯运行“example.php”即时通讯等待答案(成功或无所谓)。我正在寻找一些硬性优势... :) –

+1

请参阅我的编辑为fancier案件。不喜欢延期的API?不要使用它。 –

+1

我刚刚从http://stackoverflow.com/questions/4869609/how-can-jquery-deferred-be-used中看到了这个例子,这行'return cache [val] || $ .ajax('/ foo /',...'让我意识到我可以在callbackFunction **中使用'when' REGARDLESS **可以来自缓存或来自ajax调用的响应...很好。 –

4

我想说,延期对象只是jQuery演变的另一个步骤。

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

引入on时发生了类似的情况。与bind相比,on没有真正的优势,但它简化了事件处理,因为它结合了bind,livedelegate的功能。结果是用于事件处理的统一API。我可以使用两次相同的功能,onbinddelegate

以类似的方式,如果我想创建两个相关的Ajax调用,我可以使用两个$.ajax调用加上$.when,这是我熟悉的并且与进行一个或多个调用没有任何区别,或者我在另一个内嵌一个呼叫,这要求我以不同的方式思考执行的方式。

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

+0

推迟的对象是否仅用于异步调用? –

+0

我还没有想到当我必须使用'when'时我看到了一些例子,可以让'then'在没有'when'的时候......可以解释吗? –

+0

不,这就是为什么我把它改为“异步甚至是同步执行”......我只是经常以异步方式使用它,我认为这是它们的主要目的 –

1

延迟对象的主要优点是可以传递它们,因此对于ajax执行代码不知道还有其他人对回调感兴趣或者不想对其进行硬编码的复杂情况,它可以传递推迟对象感兴趣的插件/模块代码。

例如

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

同样的事情可以通过回调来完成,但随后你将不得不写的接口,用于从观察者的回调函数,这是不灵活,递延观察家可以做延期对象的东西。

+0

like'$(“a”)。click(preExistsingfunc)'??? –

+0

对象在'ajax_observers'中是什么样的? –

+0

是你吗?在这里使用插件? –