gpt4 book ai didi

ajax - jQuery.ajax 处理继续响应 : "success:" vs ".done"?

转载 作者:IT王子 更新时间:2023-10-29 03:23:37 25 4
gpt4 key购买 nike

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

来自 jQuery documentation 的概要我们得到:

.done(): Description: Add handlers to be called when the Deferred object is resolved.

success: (.ajax() option): A function to be called if the request succeeds.

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

最佳答案

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

例如,成功:

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

例如,完成:

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

done 的好处是 $.ajax 的返回值现在是一个延迟 promise ,可以绑定(bind)到应用程序中的任何其他地方。因此,假设您想从几个不同的地方进行此 ajax 调用。与其将成功函数作为选项传递给进行此 ajax 调用的函数,不如让函数返回 $.ajax 本身并将回调与 done 绑定(bind)、failthen 或其他。请注意,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 定义(确保返回一个 promise 或至少一个 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 - jQuery.ajax 处理继续响应 : "success:" vs ".done"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8840257/

25 4 0