105

谁能帮我?
我无法理解 和 之间success.done()区别$.ajax

如果可能,请举例说明。

4

4 回答 4

114

success仅在 AJAX 调用成功时触发,即最终返回 HTTP 200 状态。error如果失败以及complete请求完成时触发,无论成功与否。

在 jQuery 1.8 中,jqXHR对象(由 返回$.ajaxsuccess被替换为doneerrorwithfailcompletewith always

但是,您仍然应该能够使用旧语法初始化 AJAX 请求。所以这些做类似的事情:

// set success action before making the request
$.ajax({
  url: '...',
  success: function(){
    alert('AJAX successful');
  }
});

// set success action just after starting the request
var jqxhr = $.ajax( "..." )
  .done(function() { alert("success"); });

此更改是为了与 jQuery 1.5 的deferred object兼容。Deferred(现在Promise,在 Chrome 和 FX 中具有完整的原生浏览器支持)允许您链接异步操作:

$.ajax("parent").
    done(function(p) { return $.ajax("child/" + p.id); }).
    done(someOtherDeferredFunction).
    done(function(c) { alert("success: " + c.name); });

这个函数链比你使用的嵌套的回调金字塔更容易维护success

但是,请注意,done现在不推荐使用该Promise语法,then而是使用以下语法:

$.ajax("parent").
    then(function(p) { return $.ajax("child/" + p.id); }).
    then(someOtherDeferredFunction).
    then(function(c) { alert("success: " + c.name); }).
    catch(function(err) { alert("error: " + err.message); });

这是值得采用的,因为asyncawait扩展承诺改进了语法(和错误处理):

try {
    var p = await $.ajax("parent");
    var x = await $.ajax("child/" + p.id);
    var c = await someOtherDeferredFunction(x);
    alert("success: " + c.name);
}
catch(err) { 
    alert("error: " + err.message); 
}
于 2012-01-13T08:38:43.537 回答
6

简而言之,将成功回调函数与 ajax 函数解耦,这样以后您就可以在不修改原始代码的情况下添加自己的处理程序(观察者模式)。

请从此处找到更多详细信息:https ://stackoverflow.com/a/14754681/1049184

于 2012-01-13T08:41:32.523 回答
6

.success()只有当您的网络服务器以 200 OK HTTP 标头响应时才会调用 - 基本上是在一切正常的情况下。

当 deferred 被解决时,附加到 done() 的回调将被触发。当 deferred 被拒绝时,附加到 fail() 的回调将被触发。

promise.done(doneCallback).fail(failCallback)

.done() has only one callback and it is the success callback
于 2012-01-13T08:45:16.193 回答
1

success是请求成功时调用的回调,是调用的一部分$.ajaxdone实际上是由 ,jqXHR返回的对象的一部分,并在 jQuery 1.8 中$.ajax()替换。success

于 2012-01-13T08:44:00.600 回答