web-dev-qa-db-ja.com

jQueryの.catchと.failの違いは何ですか?

_.fail_の短いドキュメントには次のように書かれています。

Deferredオブジェクトが拒否されたときに呼び出されるハンドラーを追加します。

_.catch_の短いドキュメントはまったく同じです。

Deferredオブジェクトが拒否されたときに呼び出されるハンドラーを追加します。

ソース: http://api.jquery.com/category/deferred-object/

2つのメソッドで受け入れられる引数は異なるようで、_.catch_のドキュメントには、_.catch_は.then(null, fn)のエイリアスであると記載されています。

_.fail_を使用する必要がある場合と_.catch_を使用する必要がある場合はありますか?

または...機能が1つしかない場合...次のコマンドは互換性があり、互換性/歴史的な理由でのみ存在しますか?

_a) .fail(fn)

b) .catch(fn)

c) .then(null, fn)
_

JsFiddleを作成しました:

https://jsfiddle.net/sq3mh9j5/

違いがある場合は、jqueryを初めて使用し、すべてのpromise用語にまだ精通していないため、いくつかの例を提供してください。

.catchのドキュメントが.failのドキュメントを参照せず、相違点/類似性を明確にしないのはなぜですか?

Edit3.0リリースノートで.thenの動作が変更されたというメモをいくつか見つけました。 https://blog.jquery.com/2015/07/13/jquery-3-0-and-jquery-compat-3-0-alpha-versions-released/ それでもまだわからない.failを使用する場合と.catchを使用する場合。

17
Stefan

catchfailは少し異なり、catchは新しい(解決済みの)promiseを返しますが、failは元のpromiseを返します。

_// 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");
  })
_

catch(fn)then(null, fn)のエイリアスであることに注意してください。

9
Jack Wilsdon

ですから、大きな違いは、それぞれから得られるものだと思います。

キャッチを使用すると、単一の関数を実行できます。

失敗すると、いくつかの機能を実行できます。

それ以外は、私はあなたの発見に同意します。それらは非常に似ています。

Failが両方の関数を実行し、catchが1つだけを実行する方法を示すサンプルコードを追加しました。

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

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

これを実行すると、「a」、「b」、「c」が表示され、「d」は実行されません。

この簡単な例が違いを示していることを願っています。

2
SynchroDynamic