Angularjs 角度回报承诺,已经有一个捕获

Angularjs 角度回报承诺,已经有一个捕获,angularjs,promise,Angularjs,Promise,我有一个angular服务,提供登录功能,以便登录用户: app.service('AuthSharedService', function($rootScope, $http, authService, UserSession) { this.login = function(email, password, rememberMe) { return $http.post('/login', { '

我有一个angular服务,提供登录功能,以便登录用户:

app.service('AuthSharedService', function($rootScope, $http, authService, UserSession) {
    this.login = function(email, password, rememberMe) {
        return $http.post('/login',
                {
                    'email': email,
                    'password': password,
                    'rememberMe': rememberMe
                })
            .then(function(response){
                console.log("success 1");
                authService.loginConfirmed(response.data);
            }).catch(function(response){
                console.log("catch 1");
            }).finally(function(response){
                console.log("finally 1");
            });
    };
    return this;
});
我还有一个绑定到HTML登录公式的控制器:

app.controller("loginController",
    function ($scope, $rootScope, $window, $http, $routeParams, AuthSharedService){
        var vm = this;
        vm.email;
        vm.password;
        vm.rememberMe;
        vm.login = function (){
            AuthSharedService.login(vm.email, vm.password, vm.rememberMe)
                .then(function(response){
                    console.log("success 2");
                }).catch(function(response){
                    console.log("catch 2");
                });
        }
    }
);
到目前为止,它是非常基本的。
但是当我删除数据库用户表并尝试登录时,REST服务器上当然会出现内部错误500。但是angular的控制台输出是:

catch 1
success 2
但是为什么呢?我不能返回
$http
以使用
.then(function())
.catch(function())
两次吗

感谢您的帮助:)

问候您

catch
返回默认成功的新承诺;这允许您创建捕获错误的链,然后继续执行一些默认的成功场景:

returnsPromise()
    .catch(() => 'default value')
    .then(value => alert(value))
这将从
returnsPromise
警告值,或者,如果失败,则警告默认值
“默认值”

您要返回的是原始的
$http
承诺,而不是捕获的承诺:

let p = $http.post(...);
p.catch(...);
return p;

如果
post()
失败,则如果发生错误,将调用已附加的
catch
和您可能附加的任何其他错误处理程序。相反,只有当
p
成功时,才会调用成功处理程序(而
catch
不会)。

catch
返回默认成功的新承诺;这允许您创建捕获错误的链,然后继续执行一些默认的成功场景:

returnsPromise()
    .catch(() => 'default value')
    .then(value => alert(value))
这将从
returnsPromise
警告值,或者,如果失败,则警告默认值
“默认值”

您要返回的是原始的
$http
承诺,而不是捕获的承诺:

let p = $http.post(...);
p.catch(...);
return p;

如果
post()
失败,则如果发生错误,将调用已附加的
catch
和您可能附加的任何其他错误处理程序。相反,只有当
p
成功时,才会调用成功处理程序(而
catch
不会)。当调用
.catch
时,它会返回一个承诺。如果您不返回任何内容,它将返回自动解析的承诺

如果要在
.catch
之后在错误状态下遵守承诺,可以执行以下操作:

promise
.catch(function(response) {
    handleResponse(response);
    return $q.reject(response);
});
您也可以这样做:

var promise = ...;
promise.catch(...);
return promise

但是请记住,如果
catch
回调是异步的,则此代码可能不会按您所希望的方式运行。

当您调用
.catch
时,它会返回一个承诺。如果您不返回任何内容,它将返回自动解析的承诺

如果要在
.catch
之后在错误状态下遵守承诺,可以执行以下操作:

promise
.catch(function(response) {
    handleResponse(response);
    return $q.reject(response);
});
您也可以这样做:

var promise = ...;
promise.catch(...);
return promise
但是请记住,如果
catch
回调是异步的,则此代码可能不会按您所希望的方式运行