$.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('');
}
);
抱歉, 看到任何优势
你能解释一下吗?
或者你可以给我示例前者不能由后者完成......?
答案 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
,但它简化了事件处理,因为它结合了bind
,live
和delegate
的功能。结果是用于事件处理的统一API。要么我使用相同功能的两倍on
,要么bind
和delegate
。
以类似的方式,如果我想进行两次相关的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)
}
同样的事情可以通过回调来完成,但是你必须编写一个接口来从观察者那里获得回调函数,这是不灵活的,延迟观察者可以对延迟对象做任何事情。