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}
いくつかの質問が発生します。
$q.reject()
とdeferred.reject()
の違いは何ですか?それぞれをいつ使用するか?deferred.promise.then(successFn, errorFn)
のerrorFn
とdeferred.promise.catch(catchFn)
のcatchFn
の関係は何ですか?catch()
関数が常に呼び出されますか?ネストされたプロミスの1つにcatch関数も定義されている場合はどうなりますか?そのキャッチは、最も外側のキャッチの実行を妨げますか?ありがとう。
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
});
わかりました、これは約束からの私の見解です。
$q.reject(reason)
は、引数として渡され、延期された理由とともに拒否されたプロミスを返します。拒否は、プロセスが終了したかどうかに関係なく、延期された既存のユーザーを拒否します。
errorFn
は、約束が拒否されたときに起動され、その引数が拒否された理由です。 Catchは、Promiseプロセス内のエラーが適切に処理されず、Promiseが発生して例外が発生し、拒否または履行されなかったときに呼び出されます。
入れ子になったプロミスはありません。チェーンプロミスを使用する必要があります。この場合、処理する他のブロックが指定されていない場合、最新のcatchブロックがその前にあるすべてをキャッチする必要があります。