52

jQuery关于文档jQuery.post( )

// Assign handlers immediately after making the request,
// and remember the jqxhr object for this request
var jqxhr = $.post( "example.php", function() {
  alert( "success" );
})
  .done(function() {
    alert( "second success" );
  })
  .fail(function() {
    alert( "error" );
  })
  .always(function() {
    alert( "finished" );
});

// Perform other work here ...

// Set another completion function for the request above
jqxhr.always(function() {
  alert( "second finished" );
});

success:参数和方法有什么区别jqXHR.done( );如果没有,该jqXHR.done( )方法的重点是什么?

4

4 回答 4

70

jQuery 过去只有successerror和的回调函数complete

然后,他们决定使用 jqXHR 对象来支持 Promise,然后他们本着 Promise API 的精神添加了.done(), .fail(), .always(), 等等。这些新方法的用途与回调大致相同,但形式不同。您可以使用更适合您的编码风格的任何 API 风格。

随着人们越来越熟悉 Promise 以及越来越多的异步操作使用这个概念,我怀疑随着时间的推移会有越来越多的人转向 Promise API,但与此同时 jQuery 支持这两者。

.success()方法已被弃用,取而代之的是通用的 Promise 对象方法名称。

jQuery 文档中,您可以看到各种 promise 方法与回调类型的关系:

jqXHR.done(函数(数据,文本状态,jqXHR){});成功回调选项的替代构造,.done() 方法替换了已弃用的 jqXHR.success() 方法。有关实现细节,请参阅 deferred.done()。

jqXHR.fail(function(jqXHR, textStatus, errorThrown) {}); 错误回调选项的替代构造, .fail() 方法替换了已弃用的 .error() 方法。有关实现细节,请参阅 deferred.fail()。

jqXHR.always(函数(数据|jqXHR, textStatus, jqXHR|errorThrown) { }); 完成回调选项的替代构造,.always() 方法替换了已弃用的 .complete() 方法。

响应成功的请求,该函数的参数与 .done() 的参数相同:data、textStatus 和 jqXHR 对象。对于失败的请求,参数与 .fail() 的参数相同:jqXHR 对象、textStatus 和 errorThrown。有关实现细节,请参阅 deferred.always()。

jqXHR.then(函数(数据,textStatus,jqXHR){},函数(jqXHR,textStatus,errorThrown){});结合了 .done() 和 .fail() 方法的功能,允许(从 jQuery 1.8 开始)底层的 Promise 被操纵。有关实现细节,请参阅 deferred.then()。

如果你想以更符合 ES6 Promises 标准的方式进行编码,那么在这四个选项中你只会使用.then().

于 2014-03-06T02:17:54.320 回答
17

选择 Promises 而不是回调函数的原因是有多个回调并避免像 Callback Hell 这样的问题。

回调地狱(有关更多详细信息,请参阅http://callbackhell.com/):异步 javascript 或使用回调的 javascript 很难直观地做到正确。很多代码最终看起来像这样:

asyncCall(function(err, data1){
    if(err) return callback(err);       
    anotherAsyncCall(function(err2, data2){
        if(err2) return calllback(err2);
        oneMoreAsyncCall(function(err3, data3){
            if(err3) return callback(err3);
            // are we done yet?
        });
    });
});

使用 Promises,上面的代码可以重写如下:

asyncCall()
.then(function(data1){
    // do something...
    return anotherAsyncCall();
})
.then(function(data2){
    // do something...  
    return oneMoreAsyncCall();    
})
.then(function(data3){
    // the third and final async response
})
.fail(function(err) {
    // handle any error resulting from any of the above calls    
})
.done();
于 2015-01-26T12:39:34.450 回答
8

.done()和都是.success()回调函数,它们的功能本质上是相同的。

这是文档。区别在于.success()从 jQuery 1.8 开始不推荐使用。你应该.done()改用。

如果您不想点击链接:

弃用通知

自 jQuery 1.8 起,jQuery 1.5 中引入的jqXHR.success()jqXHR.error()和callback 方法已被弃用。jqXHR.complete()要为最终删除准备您的代码,请使用jqXHR.done(), jqXHR.fail()jqXHR.always()

于 2014-03-06T02:16:56.467 回答
0

从文档

jqXHR.done(函数(数据,文本状态,jqXHR){});

成功回调选项的替代构造,.done() 方法替换了已弃用的jqXHR.success() 方法。有关实现细节,请参阅 deferred.done()。

它只是成功回调选项的替代方案,jqXHR.success()已被弃用。

于 2014-03-06T02:17:12.847 回答