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

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

问题描述:

关于的短文档失败jQuery 3.2.1中的.catch和.fail有什么区别?

“添加处理程序以在拒绝Deferred对象时调用”。

短文档.catch说如出一辙:

“当递延对象拒绝被称为添加处理程序。”

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

的两种方法的函数的参数似乎是不同的,并且的 该文档.catch指出.catch是别名。然后(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。

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("fail"); 
    }) 
    .then(function() { 
    console.log("then after catch"); 
    }) 

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

+1

“*将重新解决的承诺*” 是非常容易引起误解。重要的一点是,它会返回一个新的,明确的承诺(就像'then')。 – Bergi

+1

啊,明白了。我不知道如何描述它 - 我会更新我的答案。谢谢 –

+0

所以,如果我想'打破/退出'错误的正常工作流程......我会使用'失败'(第一个例子),如果我想实现'always'子句,我使用'catch' (第二个例子)。 – Stefan

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

一个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'不运行。

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