一尘不染

AngularJS承诺拒绝链接

angularjs

我需要创建链式承诺:

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,但是它将异常跟踪写入控制台,这不好。

还有另一种选择可以清楚地做到这一点吗?那是什么原因呢?为什么要这样做?在哪种情况下,当前行为可能有用?


阅读 225

收藏
2020-07-04

共1个答案

一尘不染

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

当您在errorHandler中尝试修复错误状态并以某种方式解决promise时,它会很有用。

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);
2020-07-04