$ .ajax的成功和.done()方法有什么区别

Poo*_*att 98 jquery jquery-deferred

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

如果可能请举例.

Kei*_*ith 104

success仅在AJAX调用成功时触发,即最终返回HTTP 200状态.error如果失败并且complete请求结束时触发,无论成功与否.

在jQuery 1.8中,jqXHR对象(返回者$.ajax)success被替换为done,errorwith failcompletewith 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"); });
Run Code Online (Sandbox Code Playgroud)

此更改是为了与jQuery 1.5的延迟对象兼容.延迟(现在Promise,Chrome和FX中具有完全本机浏览器支持)允许您链接异步操作:

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

这个函数链比你得到的嵌套金字塔回调更容易维护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); });
Run Code Online (Sandbox Code Playgroud)

这值得采用,因为async并且await扩展了promises改进的语法(和错误处理):

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); 
}
Run Code Online (Sandbox Code Playgroud)


bat*_*tar 10

简而言之,从ajax函数中解耦成功回调函数,以便以后可以添加自己的处理程序而无需修改原始代码(观察者模式).

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

  • 我无法相信错误解释这个问题的答案既是最高投票又是公认的解决方案...... (28认同)
  • 这个答案忽略了这一点.`success:`用作参数,`.success()`用作`jqXHR`的方法.后者正在被弃用,但前者是OP所要求的. (25认同)
  • 不推荐使用成功/错误/完成,并且基于AJAX状态更改; done/fail/always基于jQuery Deferred状态更改.请参阅http://api.jquery.com/category/deferred-object/. (2认同)

Sam*_*iri 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
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,当使用200/OK状态代码发回格式错误的JSON时,不会调用.success().具体来说,我遇到了一个问题,网络服务器后端代码生成NaN值并将它们序列化为javascript NaN(即作为符号,而不是字符串'NaN'),这实际上是无效的JSON - 所以将响应解析为JSON失败并执行.fail(),但响应状态为200.但是,仅使用OK状态代码调用成功仍然是正确的.只是想指出,仅仅因为它没关系,并不意味着它'成功';) (3认同)