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

时间:2017-04-13 09:44:26

标签: jquery promise deferred

.fail的简短文档说:

  

添加要在拒绝Deferred对象时调用的处理程序。

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

  

添加要在拒绝Deferred对象时调用的处理程序。

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

这两种方法所接受的论点似乎是不同的,而且是 .catch指出.catch.then(null, fn)

的别名

我是否应该使用.fail以及我应该使用.catch的其他人?

或者...如果我只有一个功能......以下命令是可以互换的,它们只是出于兼容性/历史原因而存在?

a) .fail(fn)

b) .catch(fn)

c) .then(null, fn)

我创建了一个jsFiddle:

https://jsfiddle.net/sq3mh9j5/

如果存在差异,请您提供一些示例,因为我不熟悉jquery并且还不熟悉所有承诺条款。

为什么.catch的文档没有引用.fail的文档并澄清差异/相似性?

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

2 个答案:

答案 0 :(得分:7)

catchfail略有不同,因为catch将返回新的(已解决的)承诺,而fail将返回原始承诺。

// 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).

答案 1 :(得分:2)

所以我认为主要区别在于你从中获得的每一个。

catch允许您运行单个函数。

失败允许您运行许多功能。

除此之外,我同意你的发现。它们非常相似。

我添加了一个示例代码来展示fail将如何运行这两个函数,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'不会运行。

我希望这个简单的例子展示出差异。