我应该使用哪一个?
有没有理由使用一个而不是另一个?
错误处理更好吗?
$.ajax({
url: url,
data: { start: start, end: end }
}).done(function(data, textStatus, jqXHR) {
$('#myElement').append(data);
}).fail(function() {
// report error
});
OR
$.ajax({
url: url,
data: { start: start, end: end },
success: function(data, textStatus, jqXHR) {
$('#myElement').append(data);
},
error: function(jqXHR, textStatus, errorThrown) {
// report error
}
});
答案 0 :(得分:38)
这两个选项是等效的。
但是,promise样式接口(.fail()
和.done()
)允许您将创建请求的代码与处理响应的代码分开。
您可以编写一个发送AJAX请求并返回jqXHR对象的函数,然后在其他地方调用该函数并添加一个处理程序。
当与.pipe()
函数结合使用时,promise样式接口还可以在进行多个AJAX调用时帮助减少嵌套:
$.ajax(...)
.pipe(function() {
return $.ajax(...);
})
.pipe(function() {
return $.ajax(...);
})
.pipe(function() {
return $.ajax(...);
});
答案 1 :(得分:28)
只是为了清新起来...
自jQuery 1.8起,成功和错误方法已被弃用。
弃用注意:自jQuery 1.8起,不推荐使用jqXHR.success(),jqXHR.error()和jqXHR.complete()回调。要准备最终删除的代码,请改用jqXHR.done(),jqXHR.fail()和jqXHR.always()。
答案 2 :(得分:1)
使用chainable deferred object承诺样式可以使结构更清晰并使用always。
let data = {"key":"value"}
$.ajax({
type: 'PUT',
url: 'http://example.com/api',
contentType: 'application/json',
data: JSON.stringify(data),
}).done(function () {
console.log('SUCCESS');
}).fail(function (msg) {
console.log('FAIL');
}).always(function (msg) {
console.log('ALWAYS');
});