jQuery.ajax处理继续响应:“success:”vs“.done”?

时间:2012-01-12 18:25:00

标签: ajax jquery

我已经使用jQuery和AJAX几周了,我看到两种不同的方法可以在调用完成后“继续”脚本:success:.done

从我们得到的jQuery documentation的概要:

  

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

     

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

因此,在AJAX调用完成/解决之后,两者都做了一些事情。我可以随机使用其中一个吗?当使用一个而不是另一个时,有什么区别?

3 个答案:

答案 0 :(得分:443)

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

例如,成功:

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

例如,完成:

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

关于done的好处是$.ajax的返回值现在是一个延迟的promise,可以绑定到应用程序中的任何其他位置。所以,假设你想从几个不同的地方进行这个ajax调用。您可以让函数返回$.ajax本身并将回调绑定到donefail,{而不是将成功函数作为执行此ajax调用的函数的选项传递给您。 {1}},或者其他什么。请注意,then是一个回调,无论请求成功还是失败,它都将运行。 always只会在成功时触发。

例如:

done

这在可维护性方面的一个重要好处是,您已将ajax机制包装在特定于应用程序的功能中。如果您决定将来需要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方法,或者您不再使用jQuery,则只需更改$.ajax定义(确保在上面的例子中,返回一个promise或至少一个xhr_get方法。整个应用程序中的所有其他引用可以保持不变。

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

$.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 }); http://api.jquery.com/category/deferred-object/

注意:自jQuery 1.8起,$.Deferred已被弃用,支持以完全相同的方式使用pipe

答案 1 :(得分:4)

如果您的ajax中需要class Edge(Base): __tablename__ = 'edge' id = Column(Integer, primary_key=True) graph_id = Column(Integer, ForeignKey('graph.id')) graph= relationship('Graph', back_populates='graph_edges') type_1_node_id = Column(Integer, ForeignKey('type_1_node.id')) type_1_node = relationship('Type1Node', back_populates='edges', foreign_keys=[type_1_node_id, graph_id]) type_2_node_id = Column(Integer, ForeignKey('type_2_node.id')) type_2_node = relationship('Type2Node', back_populates='edges', foreign_keys=[type_2_node_id, graph_id ]) __table_args__ = ( ForeignKeyConstraint( ['type_1_node_id', 'graph_id'], ['type_1_node.id','type_1_node.graph_id']), ForeignKeyConstraint( ['type_2_node_id', 'graph_id'], ['type_2_node.id','type_2_node.graph_id']), ) class Type1Node(Base): __tablename__ = 'type_1_node' id = Column(Integer, primary_key=True) graph_id = Column(Integer, ForeignKey('graph.id')) graph = relationship('Graph', back_populates='graph_1_nodes') edges = relationship('Edge', back_populates='type_1_node') class Type2Node(Base): __tablename__ = 'type_2_node' id = Column(Integer, primary_key=True) graph_id = Column(Integer, ForeignKey('graph.id')) graph = relationship('Graph', back_populates='graph_2_nodes') edges = relationship('Edge', back_populates='type_2_node') ,则应使用async: false代替success。否则,最好使用.done。 这来自jQuery official site

  

从jQuery 1.8开始,不推荐使用 async:false 和jqXHR($ .Deferred);你必须使用成功/错误/完整回调选项而不是 jqXHR对象的相应方法,例如 jqXHR.done( )

答案 2 :(得分:0)

来自JQuery Documentation

$.ajax()返回的jqXHR对象从jQuery 1.5开始实现Promise接口,为它们提供Promise的所有属性,方法和行为(有关更多信息,请参见Deferred object)。这些方法采用一个或多个函数参数,这些参数在$.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被操纵。有关实现的详细信息,请参阅延迟的.then()

弃用通知jqXHR.success()jqXHR.error()jqXHR.complete()回调从jQuery 3.0开始被删除。您可以使用 改为jqXHR.done()jqXHR.fail()jqXHR.always()