我已经使用jQuery和AJAX几周了,我看到两种不同的方法可以在调用完成后“继续”脚本:success:
和.done
。
从我们得到的jQuery documentation的概要:
.done():描述:添加要在解析Deferred对象时调用的处理程序。
success:(。ajax()option):请求成功时调用的函数。
因此,在AJAX调用完成/解决之后,两者都做了一些事情。我可以随机使用其中一个吗?当使用一个而不是另一个时,有什么区别?
答案 0 :(得分:443)
success
一直是jQuery成功回调的传统名称,定义为ajax调用中的一个选项。但是,由于$.Deferreds
和更复杂的回调的实现,done
是实现成功回调的首选方式,因为它可以在任何deferred
上调用。
例如,成功:
$.ajax({
url: '/',
success: function(data) {}
});
例如,完成:
$.ajax({url: '/'}).done(function(data) {});
关于done
的好处是$.ajax
的返回值现在是一个延迟的promise,可以绑定到应用程序中的任何其他位置。所以,假设你想从几个不同的地方进行这个ajax调用。您可以让函数返回$.ajax
本身并将回调绑定到done
,fail
,{而不是将成功函数作为执行此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)
$.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()
。