web-dev-qa-db-ja.com

角度$ q.reject()vs deferred.reject()

Angular $qサービスとその関連オブジェクトおよびAPIのハンドルを取得しようとしています。コンソールでオブジェクトを見ると、次のように見えます:

var deferred = $q.defer()

...(and then from console inspection)...

$q: Object {defer: function, reject: function, when: function, all: function}

deferred: Object {resolve: function, reject: function, notify: function, promise: Object}

deferred.promise: Object {then: function, catch: function, finally: function}

いくつかの質問が発生します。

  1. $q.reject()deferred.reject()の違いは何ですか?それぞれをいつ使用するか?
  2. deferred.promise.then(successFn, errorFn)errorFndeferred.promise.catch(catchFn)catchFnの関係は何ですか?
  3. ネストされたプロミスの束があり、エラーが発生した場合、最も外側のcatch()関数が常に呼び出されますか?ネストされたプロミスの1つにcatch関数も定義されている場合はどうなりますか?そのキャッチは、最も外側のキャッチの実行を妨げますか?

ありがとう。

63
lostdorje

1)$q.reject()は、遅延オブジェクトを作成してすぐに拒否するためのショートカットです。エラーを処理できない場合、これをerrorFnでよく使用します。

2)なし。promise.catch(errorFn)$httpサービスの成功およびエラーメソッドと同様に、promise.then(null, errorFn)の単なる構文上のシュガーなので、次のようなコードを記述できます。

promise.
    then(function(result){
        // handle success
        return result;
    }, function errorHandler1(error){
        // handle error, exactly as if this was a separate catch in the chain.

    }).catch(function errorHandler2(error){
        // handle errors from errorHandler1
    });

3)これはまさに$ q.rejectが役に立つ場所です:

promise.
    catch(function(error){
       //Decide you can't handle the error
       return $q.reject(error); //This forwards the error to the next error handler;
    }).catch(function(error){
       // Here you may handle the error or reject it again.
       return 'An error occurred'; 
       //Now other errorFn in the promise chain won't be called, 
       // but the successFn calls will.
    }).catch(function(error){
       // This will never be called because the previous catch handles all errors.
    }).then(function(result){
       //This will always be called with either the result of promise if it was successful, or 
       //'An error occured' if it wasn't
    });
94
dustyrockpyle

わかりました、これは約束からの私の見解です。

  1. $q.reject(reason)は、引数として渡され、延期された理由とともに拒否されたプロミスを返します。拒否は、プロセスが終了したかどうかに関係なく、延期された既存のユーザーを拒否します。

  2. errorFnは、約束が拒否されたときに起動され、その引数が拒否された理由です。 Catchは、Promiseプロセス内のエラーが適切に処理されず、Promiseが発生して例外が発生し、拒否または履行されなかったときに呼び出されます。

  3. 入れ子になったプロミスはありません。チェーンプロミスを使用する必要があります。この場合、処理する他のブロックが指定されていない場合、最新のcatchブロックがその前にあるすべてをキャッチする必要があります。

5