【问题标题】:Should I use .done() and .fail() for new jQuery AJAX code instead of success and error我应该为新的 jQuery AJAX 代码使用 .done() 和 .fail() 而不是成功和错误
【发布时间】:2012-06-07 12:31:04
【问题描述】:

我的代码是这样的:

$.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID },
    success: function (data) {
        $('#CityID').html(data);
    },
    error: function (ajaxContext) {
        alert(ajaxContext.responseText)
    }
});

但是当我看到最后的 jQuery .ajax() documentation 时,它似乎建议我应该像下面这样编码,或者至少它建议添加一个.done() 和一个.fail()

var request = $.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID }
});

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

更新

如果我这样编码,是一样的还是把它分成三个有好处?

$.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID }
}).done(function (data) {
    xxx;
}).fail(function (jqXHR, textStatus) {
    xxx;
});

【问题讨论】:

    标签: jquery


    【解决方案1】:

    如user2246674所说,使用successerror作为ajax函数的参数是有效的。

    为了与先例保持一致,请阅读文档:

    弃用通知

    jqXHR.success()、jqXHR.error() 和 jqXHR.complete() 回调将在 jQuery 1.8 中被弃用。要为最终删除代码做好准备,请改用 jqXHR.done()、jqXHR.fail() 和 jqXHR.always()。

    如果您使用回调操作函数(例如使用方法链),请使用.done().fail().always() 而不是success()error()complete()

    【讨论】:

    • 我不同意。参考文献讨论了 回调操作函数(例如 .error.success),这些函数被弃用,以支持更通用的 Deferred 模式,但 ajax 方法的参数没有被弃用,它们都是有效且可接受的——即使在 jQuery 1.9/2.0 中!在所有当前形式中,ajax 仍然返回 Deferred;可能已经附加了延迟回调。
    • 在这里,jQuery 1.9 和success:、error: 和complete: 仍然可用。但是,我的问题是,.done() == 是否成功:?
    • @GregoryLewis 来自 JQuery 1.10 源代码:jqXHR.success = jqXHR.done;.
    • 老实说,我更喜欢successfailalways
    • 哇,我也误读了文档。我真的认为 $.ajax 的“成功”/“错误”选项被重写为“完成/失败”。这只是回调方法链。老实说,我认为他们也应该切换选项名称。这让我难倒了好几个小时。
    【解决方案2】:

    我想在@Michael Laffargue 的帖子上添加一些内容:

    jqXHR.done() 更快!

    jqXHR.success() 在回调中有一些加载时间,有时可能会过度杀伤脚本。我以前很难做到这一点。

    更新:

    使用jqXHR.done()jqXHR.fail()jqXHR.always(),您可以更好地处理ajax 请求。一般来说,您可以在某个变量或对象中定义 ajax,并在代码的任何部分使用该变量或对象并更快地获取数据。好例子:

    /* Initialize some your AJAX function */
    function call_ajax(attr){
        var settings=$.extend({
            call            : 'users',
            option          : 'list'
        }, attr );
    
        return $.ajax({
            type: "POST",
            url: "//exapmple.com//ajax.php",
            data: settings,
            cache : false
        });
    }
    
    /* .... Somewhere in your code ..... */
    
    call_ajax({
        /* ... */
        id : 10,
        option : 'edit_user'
        change : {
              name : 'John Doe'
        }
        /* ... */
    }).done(function(data){
    
        /* DO SOMETHING AWESOME */
    
    });
    

    【讨论】:

    • 您有任何可信且可验证的参考资料吗?
    • @PaulVargas 我从不做一些性能测试,但在我的实践中我发现这很有效。你可以自己试试。
    • 请提供任何可信的证据。
    • 如您所知,与从函数返回一些对象相比,回调函数要慢一些。有时影响很小,但有时如果您有很多电话,影响可能会很大。
    【解决方案3】:

    简单来说

    $.ajax("info.txt").done(function(data) {
      alert(data);
    }).fail(function(data){
      alert("Try again champ!");
    });
    

    如果它获取 info.text,那么它会发出警报以及您添加的任何功能,或者如果无法从服务器检索 info.text,那么它会发出警报或错误功能。

    【讨论】:

      【解决方案4】:

      当我们要在我们现有的旧应用程序中将 JQuery 从 1.x 迁移到 2x 或 3.x 时,我们将使用 .done,.fail 而不是 success,error 因为 JQuery up gradation 将被弃用这些方法。例如,当我们调用服务器 Web 方法时,服务器将 promise 对象返回给调用方法(Ajax 方法),并且这个 promise 对象包含 .done、.fail..etc 方法。因此我们将相同的成功和失败回复。下面是示例(它用于 POST 请求,我们可以为 GET 之类的请求类型构造相同的方式...)

       $.ajax({
                  type: "POST",
                  url: url,
                  data: '{"name" :"sheo"}',
                  contentType: "application/json; charset=utf-8",
                  async: false,
                  cache: false
                  }).done(function (Response) {
                        //do something when get response            })
                 .fail(function (Response) {
                          //do something when any error occurs.
                      });
      

      【讨论】:

        猜你喜欢
        • 2023-03-23
        • 1970-01-01
        • 2017-09-10
        • 2014-03-06
        • 1970-01-01
        • 2013-03-11
        • 1970-01-01
        • 1970-01-01
        • 2014-06-14
        相关资源
        最近更新 更多