jQuery 中的 .catch 和 .fail 有什么区别?

What is the difference between .catch and .fail in jQuery?

.fail 的简短文档说:

Add handlers to be called when the Deferred object is rejected.

.catch 的简短文档完全相同:

Add handlers to be called when the Deferred object is rejected.

来源:http://api.jquery.com/category/deferred-object/

这两种方法接受的参数好像不一样,文档 .catch 表示 .catch.then(null, fn)

的别名

在某些情况下我应该使用 .fail 而在其他情况下我应该使用 .catch

或者...如果我只有一个功能...以下命令是否可以互换并且它们仅出于 compatibility/historical 原因而存在?

a) .fail(fn)

b) .catch(fn)

c) .then(null, fn)

我创建了一个 jsFiddle:

https://jsfiddle.net/sq3mh9j5/

如果有区别,请提供一些例子,因为我是 jquery 的新手,还不熟悉所有的承诺条款。

为什么 .catch 的文档没有引用 .fail 的文档并阐明 difference/similarity?

编辑 我在 3.0 发行说明中发现了一些说明 .then 的行为发生了变化。 https://blog.jquery.com/2015/07/13/jquery-3-0-and-jquery-compat-3-0-alpha-versions-released/ 尽管如此,我仍然不确定何时使用 .fail 以及何时使用 .catch。

所以我认为主要区别在于你从中得到了什么。

一个 catch 允许您 运行 一个函数。

一个失败允许你运行一些功能。

除此之外,我同意你的发现。他们很相似。

我添加了一个示例代码来展示 运行 这两个函数如何失败,而捕获只会 运行 一个。

 $.ajax({
            url: "abc"
        }).done(function (data) {

        }).fail(function () {
            alert("a");
        }, function () {
            alert("b");
        })
                .catch(function () {
                    alert("c");
                }, function () {
                    alert("d");
                });

如果你 运行 你得到 'a','b','c' 然后 'd' 不会 运行.

我希望这个简单的例子能展示出不同之处。

catchfail 略有不同,因为 catch 将 return 一个新的(已解决的)承诺,而 fail 将 return 原来的承诺。

// This will only output "fail"
$.Deferred()
  .reject(new Error("something went wrong"))
  .fail(function() {
    console.log("fail");
  })
  .then(function() {
    console.log("then after fail");
  })
// This will output "catch" and "then after catch"
$.Deferred()
  .reject(new Error("something went wrong"))
  .catch(function() {
    console.log("catch");
  })
  .then(function() {
    console.log("then after catch");
  })

Note that catch(fn) is an alias of then(null, fn).