2017-04-13 248 views
7

關於的短文檔失敗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。

回答

1

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

1

所以我認爲主要的區別在於你得到的每一個。

一個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'不運行。

我希望這個簡單的例子展示它的不同之處。