30

我需要创建链式承诺:

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,第二个then将被解决,并且它的 successCallback 将被调用。但如果我删除errorHandler,那么第二个承诺将被拒绝。

根据 Angular JS 文档,传播拒绝的唯一方法是返回$q.reject();,它看起来并不明显,特别是因为$q即使不需要,我也必须注入服务;

也可以通过在 中抛出异常来完成errorHandler,但是它将异常跟踪写入控制台,这不好。

是否有另一种选择以明确的方式做到这一点?原因是什么?为什么要完成?在哪种情况下,当前行为可能有用?

4

2 回答 2

68

以及这样做的原因是什么。在哪种情况下,当前行为可能有用?

当您在 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);
于 2013-10-16T09:59:57.600 回答
5

晚会迟到了,但因为我在这里;

我更喜欢将$http错误用于其本机错误处理,而不是通过 a200和响应中的错误状态返回成功。

控制台中的打印400500错误不是问题,如果您正在调试,如果没有,您会看到它们。

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);           
        }
    )

}])
于 2014-12-30T06:20:39.367 回答