連鎖プロミスを作成する必要があります。
_var deferred = $q.defer();
$timeout(function() {
deferred.reject({result: 'errror'});
}, 3000);
deferred.promise.then(angular.noop, function errorHandler(result) {
//some actions
return result;
}).then(function successCallback(result) {
console.log('what do I do here?');
return result;
}, function errorCallback(result) {
$scope.result= result;
return result;
});
_
ErrorCallbackを最初のthen
に入れると、2番目のthen
が解決され、そのsuccessCallbackが呼び出されます。しかし、errorHandler
を削除すると、2番目のプロミスは拒否されます。
Angular JS docsによると、拒否を伝播する唯一の方法は$q.reject();
を返すことであり、特に_$q
_サービスを注入する必要があるため必要ありません。
errorHandler
に例外をスローすることでも実行できますが、例外トレースをコンソールに書き込みますが、良くありません。
これを明確に行う別のオプションはありますか?そしてその理由は何ですか?なぜそれが行われるのですか?どちらの場合、現在の動作が役立ちますか?
そして、なぜそれが行われるのか。どちらの場合、現在の動作が役立ちますか?
ErrorHandlerでエラー状態を修復し、何らかの方法でプロミスを解決できる場合に役立ちます。
var retriesCount = 0;
function doWork()
{
return $http.post('url')
.then(function(response){
// check success-property of returned data
if(response.data.success)
// just unwrap data from response, may be do some other manipulations
return response.data;
else
// reject with error
return $q.reject('some error occured');
})
.catch(function(reason){
if(retriesCount++ < 3)
// some error, let me try to recover myself once again
return doWork();
else
// mission failed... finally reject
return $q.reject(reason);
});
}
doWork().then(console.log, console.error);
パーティーに遅れましたが、私はここにいます。
$http
および応答のエラーステータスを介して成功を返すのではなく、ネイティブエラー処理に200
エラーを使用することを好みます。
コンソールで400
または500
エラーを印刷することは問題ではありません。デバッグしている場合、そうでない場合は表示されます。
angular.module('workModule', [])
// work provider handles all api calls to get work
.service('workProvider', ['$http', '$q', function($http, $q) {
var endpoint = '/api/v1/work/';
this.Get = function(){
// return the promise, and use 404, 500, etc for errors on the server
return $http.get(endpoint);
};
}])
.controller('workController', ['workProvider', function('workProvider'){
workProvider.Get().then(
function(response){ // success
console.log(response.data);
},
function(response){ // error
console.log(response.data);
}
)
}])