【问题标题】:jQuery.post( ) .done( ) and success:jQuery.post() .done() 和成功:
【发布时间】:2014-03-06 02:12:55
【问题描述】:

jQueryjQuery.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( ) 方法的全部意义是什么?

【问题讨论】:

    标签: jquery jqxhr


    【解决方案1】:

    jQuery 过去只有 successerrorcomplete 的回调函数。

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

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

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

    jQuery doc,你可以看到各种promise方法与回调类型的关系:

    jqXHR.done(function(data, textStatus, jqXHR) {}); 另一种选择 构造成功回调选项, .done() 方法替换 已弃用的 jqXHR.success() 方法。请参阅 deferred.done() 了解 实现细节。

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

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

    响应一个成功的请求,函数的参数是 与 .done() 相同:data、textStatus 和 jqXHR 对象。为了 失败的请求参数与 .fail() 的参数相同: jqXHR 对象、textStatus 和 errorThrown。参考 deferred.always() 了解实施细节。

    jqXHR.then(function(data, textStatus, jqXHR) {}, function(jqXHR, textStatus, errorThrown ) {}); 包含 .done() 和 .fail() 方法,允许(从 jQuery 1.8 开始) 潜在的 Promise 被操纵。请参阅 deferred.then() 了解 实现细节。

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

    【讨论】:

      【解决方案2】:

      比起回调函数更喜欢 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?
              });
          });
      });
      

      上面的代码可以改写如下:

      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();
      

      【讨论】:

        【解决方案3】:

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

        这是documentation。不同之处在于 .success() 自 jQuery 1.8 起已弃用。你应该改用.done()

        如果您不想点击链接:

        弃用通知

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

        【讨论】:

          【解决方案4】:

          From the doc

          jqXHR.done(function(data, textStatus, jqXHR) {});

          成功回调选项的替代构造,.done() 方法替换了 不推荐使用 jqXHR.success() 方法。参考 deferred.done() 了解实现细节。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-23
            • 2016-10-31
            • 1970-01-01
            • 1970-01-01
            • 2012-02-09
            • 1970-01-01
            • 2012-02-09
            • 2014-03-02
            相关资源
            最近更新 更多