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。
catch
和fail
略有不同,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");
})
所以我认为主要的区别在于你得到的每一个。
一个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'不运行。
我希望这个简单的例子展示它的不同之处。
“*将重新解决的承诺*” 是非常容易引起误解。重要的一点是,它会返回一个新的,明确的承诺(就像'then')。 – Bergi
啊,明白了。我不知道如何描述它 - 我会更新我的答案。谢谢 –
所以,如果我想'打破/退出'错误的正常工作流程......我会使用'失败'(第一个例子),如果我想实现'always'子句,我使用'catch' (第二个例子)。 – Stefan