Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript $http承诺不解析_Javascript_Angularjs_Angular Promise_Angular Http_Angular Http Interceptors - Fatal编程技术网

Javascript $http承诺不解析

Javascript $http承诺不解析,javascript,angularjs,angular-promise,angular-http,angular-http-interceptors,Javascript,Angularjs,Angular Promise,Angular Http,Angular Http Interceptors,我目前正在AngularJS 1.3中构建登录流。我的问题是$http调用的承诺返回没有解析其“.then”中的代码 我正在处理从服务器返回的错误消息,特别是处理当用户输入错误的用户名或密码时返回的任何401错误。但是,当返回401时,.then永远不会自行解析,其中的代码也永远不会运行 有关守则如下: $scope.login = function() { $scope.authError = null; // Try to login var promise = s

我目前正在AngularJS 1.3中构建登录流。我的问题是$http调用的承诺返回没有解析其“.then”中的代码

我正在处理从服务器返回的错误消息,特别是处理当用户输入错误的用户名或密码时返回的任何401错误。但是,当返回401时,.then永远不会自行解析,其中的代码也永远不会运行

有关守则如下:

$scope.login = function() {
    $scope.authError = null;

    // Try to login
    var promise = session.login($scope.user);

    promise.then(function(loggedIn) {

        // THIS CODE NEVER RUNS

        if ( !loggedIn ) {
            $scope.authError = localizedMessages.get('login.error.invalidCredentials');
        }

    }, function(x) {
        $scope.authError = localizedMessages.get('login.error.serverError', { exception: x });
    });
};
登录窗体的控制器作为其作用域上的登录函数,如下所示:

$scope.login = function() {
    $scope.authError = null;

    // Try to login
    var promise = session.login($scope.user);

    promise.then(function(loggedIn) {

        // THIS CODE NEVER RUNS

        if ( !loggedIn ) {
            $scope.authError = localizedMessages.get('login.error.invalidCredentials');
        }

    }, function(x) {
        $scope.authError = localizedMessages.get('login.error.serverError', { exception: x });
    });
};
我有一个会话工厂,负责登录和其他基于会话的需求。登录代码为:

login: function(credentials) {
    var $http = $injector.get('$http');
    var url = ENV.apiEndpoint + "/sessions";

    var newSession = $http.post(url, credentials);

    return newSession.then(function(data) {
        session.set(data.token);

        //THIS CODE ONLY RUNS ON A SUCCESS RESPONSE

        if(session.isAuthenticated()) {
            closeLoginModal(true);
        }

        return session.isAuthenticated();
    });
}
我已经在代码中问题所在的地方添加了注释。我不知道为什么这个代码不起作用。从我对承诺的理解来看,那么“then”应该解决无论什么样的反应,错误的成功

我有一个拦截器正在运行,但我尝试过禁用它,但最终没有成功


我遗漏了什么吗?

如果您的登录(服务器端)返回一个HTTP错误代码,如401,这应该解决为一个错误,例如,传递给
然后
的第二个函数。如果你不通过一个,它就会爆炸;这就是为什么会调用更高级别的错误函数。

401不能解析为
错误(或者在Angular中调用的任何东西)?error函数是否运行?它确实解决了一个错误,但是如果我是正确的,那么无论承诺是成功还是错误,a.then都应该解决。如果出现错误,则应调用控制器中.then的第二个函数。我错了吗?。。。所以它正在解析并运行error函数。这似乎是正确的,因为HTTP调用会导致HTTP错误代码。也许您描述的是错误的:是否调用了error函数?它确实被调用,但.then永远不会运行。也许我误解了承诺。我认为无论是成功还是错误,“then”都会运行……您将两个函数传递到
然后
。成功函数和失败函数。如果不传递失败函数,它将不会运行。第一个函数只在成功时运行,HTTP错误代码为400+不是成功。如果您的代码正在设置HTTP代码,则需要将其考虑在内。尝试在登录代码中输入错误处理程序。谢谢dave。这无疑是一个很大的帮助。我没有调试拦截器,但我正在接收我需要的消息。