jQuery。Ajax处理继续响应:" success:"与“.done" ?

我已经用jQuery和AJAX工作了几个星期了,我看到了两种不同的方式来“继续”脚本一旦调用已经做出:success:.done

jQuery文档的概要中,我们得到:

.done():描述:在解析Deferred对象时添加要调用的处理程序。

success:(.ajax()选项):请求成功时调用的函数。

因此,两者都在AJAX调用完成/解析之后执行一些操作。我可以随意使用其中一种吗?两者的区别是什么?什么时候用一种代替另一种?

205912 次浏览

success一直是jQuery中成功回调的传统名称,被定义为ajax调用中的一个选项。然而,由于实现了$.Deferreds和更复杂的回调,done是实现成功回调的首选方式,因为它可以在任何deferred上调用。

例如,成功:

$.ajax({
url: '/',
success: function(data) {}
});

例如,done:

$.ajax({url: '/'}).done(function(data) {});

done的好处是,$.ajax的返回值现在是一个延迟承诺,可以绑定到应用程序中的其他任何地方。假设你想从几个不同的地方进行ajax调用。与其将成功函数作为选项传递给进行ajax调用的函数,不如让函数返回$.ajax本身,并将你的回调与donefailthen或其他绑定。注意always是一个回调函数,无论请求成功还是失败都会运行。done只会在成功时被触发。

例如:

function xhr_get(url) {


return $.ajax({
url: url,
type: 'get',
dataType: 'json',
beforeSend: showLoadingImgFn
})
.always(function() {
// remove loading image maybe
})
.fail(function() {
// handle request failures
});


}


xhr_get('/index').done(function(data) {
// do stuff with index data
});


xhr_get('/id').done(function(data) {
// do stuff with id data
});

就可维护性而言,这样做的一个重要好处是将ajax机制包装在特定于应用程序的函数中。如果你决定你需要你的$.ajax调用在未来以不同的方式操作,或者你使用不同的ajax方法,或者你远离jQuery,你只需要改变xhr_get定义(确保返回一个承诺或至少一个done方法,在上面的例子中)。整个应用程序中的所有其他引用都可以保持不变。

你可以用$.Deferred做更多(更酷的)事情,其中之一是使用pipe在服务器报告的错误上触发失败,即使$.ajax请求本身成功了。例如:

function xhr_get(url) {


return $.ajax({
url: url,
type: 'get',
dataType: 'json'
})
.pipe(function(data) {
return data.responseCode != 200 ?
$.Deferred().reject( data ) :
data;
})
.fail(function(data) {
if ( data.responseCode )
console.log( data.responseCode );
});
}


xhr_get('/index').done(function(data) {
// will not run if json returned from ajax has responseCode other than 200
});

在这里阅读有关$.Deferred的更多信息:http://api.jquery.com/category/deferred-object/

请注意:从jQuery 1.8开始,pipe已经被弃用,取而代之的是以完全相同的方式使用then

如果你的ajax中需要async: false,你应该使用success而不是.done。否则你最好使用.done。 这来自jQuery官方网站:

从jQuery 1.8开始,已弃用异步:假和jqXHR ($.Deferred);你必须使用成功/错误/完成回调选项而不是 jqXHR对象的相应方法,如jqXHR.done ()

JQuery文档

从jQuery 1.5开始,由$.ajax()返回的jqXHR对象实现了Promise接口,为它们提供了Promise的所有属性、方法和行为(更多信息请参阅延迟的对象)。这些方法接受一个或多个函数参数,在$.ajax()请求终止时调用这些函数参数。这允许您在单个请求上分配多个回调,甚至可以在请求完成后分配回调。(如果请求已经完成,则立即触发回调。)jqXHR对象中可用的Promise方法包括:

jqXHR.done(function( data, textStatus, jqXHR ) {});

成功回调选项的另一种构造,详细实现请参考deferred.done()

jqXHR.fail(function( jqXHR, textStatus, errorThrown ) {});

作为错误回调选项的另一种构造,.fail()方法替代了已弃用的.error()方法。有关实现细节,请参阅deferred.fail()。

jqXHR.always(function( data|jqXHR, textStatus, jqXHR|errorThrown ) { });

(在jQuery 1.6中添加) 作为完全回调选项的另一种构造,.always()方法取代了已弃用的.complete()方法

在响应成功的请求时,函数的参数与.done(): data、textStatus和jqXHR对象的参数相同。对于失败的请求,参数与.fail()中的相同:jqXHR对象、textStatus和errorThrown。实现细节请参考deferred.always()

jqXHR.then(function( data, textStatus, jqXHR ) {}, function( jqXHR, textStatus, errorThrown ) {});

结合.done().fail()方法的功能,允许(从jQuery 1.8开始)对底层Promise进行操作。实现细节请参考deferred.then()

jqXHR.success()jqXHR.error()jqXHR.complete()回调函数在jQuery 3.0中被移除。你可以使用 jqXHR.done()jqXHR.fail()jqXHR.always()代替