Javascript Angularjs承诺拒绝链

Javascript Angularjs承诺拒绝链,javascript,angularjs,promise,Javascript,Angularjs,Promise,我需要创建连锁承诺: 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(

我需要创建连锁承诺:

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放入第一个
然后
,则第二个
然后
将被解析并调用其successCallback。但如果我删除了
errorHandler
,那么第二个承诺将被拒绝

根据Angular JS文档,传播拒绝的唯一方法是返回
$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);
var retriescont=0;
函数doWork()
{
返回$http.post('url')
.然后(功能(响应){
//检查返回数据的success属性
if(response.data.success)
//只需从响应中展开数据,就可以执行其他操作
返回响应数据;
其他的
//错误地拒绝
返回$q.reject('发生了一些错误');
})
.catch(函数(原因){
如果(检索NT++<3)
//一些错误,让我再次尝试恢复自我
返回定位销();
其他的
//任务失败…最终被拒绝
返回$q.拒绝(原因);
});
}
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);           
        }
    )

}])

同意-如果操作成功,服务器应仅返回200。这会影响系统监视和日志记录(错误在200个响应中被掩盖)。例外情况是数据验证(如果它是一个有效的用户流,可以返回到客户端,以发送关于如何修复的错误数据和响应)。我在服务中有以下内容:
return$http.get(endpoint)。然后(函数(response){return response.data;},函数(error){return error.data;})
但当发生错误时,数据会传递给successCallback(then()中的第一个函数),而不是errorCallback(then()中的第二个函数)。我尝试返回$q.reject(error.data)而不是返回error.data,但不起作用。为什么会发生这种情况?@AlejandroSanzDíaz“错误”发生在哪里?这是回应吗?如果是,您的“错误”响应代码是什么。200=成功,4XX或5XX将导致错误。还要检查文档是否尝试不使用
然后
而使用
成功
错误
回调。如果是这种情况,我将进行编辑。我最终使用
return$q.reject(error.data)解决了这个问题内部错误回调函数。:)无论如何,谢谢。注意:您可以使用
.catch(function(){})
而不是
。然后(null,function(){})
我投了赞成票,但我同意@Dinistro,您需要在这里输入正确的语法,并在.catch方法中捕获拒绝承诺。这是处理拒绝承诺的最有效的方法。