Angular $ q.reject()。success(),这有意义吗?

时间:2015-03-14 14:21:28

标签: javascript angularjs promise angular-promise

我正在读一本名为 MEAN Machine 的书,而且当我进入后期章节时,我已经陷入其中一个示例应用程序,那个似乎不起作用。

问题似乎发生是因为我的 mainController 调用了 authService Auth.getUser()方法,该方法可能会返回$http.get()或一个$q.reject()。由于我没有登录,它会返回$q.reject(),并且无法链接.success()承诺。

抛出以下异常:

  

TypeError:undefined不是mainCtrl.js中的函数:13

我的代码如下。


CONTROLLER
mainController

angular.module('mainCtrl', [])
    .controller('mainController', function($rootScope, $location, Auth) {
        var vm = this;

        // check to see if a user is logged in on every request
        $rootScope.$on('$routeChangeStart', function () {
            vm.loggedIn = Auth.isLoggedIn();

            // get user information on route change
            Auth.getUser()

                /* ========= PROBLEM HERE ========= */
                .success(function (data) {
                    vm.user = data;
                });
        });

        // ... other stuff
    });

服务
authService

angular.module('authService', [])

    // ===================================================
    // auth factory to login and get information
    // inject $http for communicating with the API
    // inject $q to return promise objects
    // inject AuthToken to manage tokens
    // ===================================================
    .factory('Auth', function ($http, $q, AuthToken) {

        var authFactory = {};

        // get the user info

        /* ========= PROBLEM LEADS HERE ========= */

        authFactory.getUser = function () {
            if (AuthToken.getToken())
                return $http.get('/api/me', { cache: true });
            else {
                return $q.reject({ message: 'User has no token.' });
            }
        }

我错过了什么?

1 个答案:

答案 0 :(得分:8)

用以下号码替换您对服务的电话:

解决方案A:.then(successCallback, errorCallback)

Auth.getUser().then(
    function (response) { ... },                // success handler
    function (response) {                       // error handler
        // case where user is not logged in
        // or http request fails
});

解决方案B:.then(successCallback).catch(errorCallback)

Auth.getUser()
    .then(function (response) { ... })         // success handler
    .catch(function (response) {               // error handler
        // case where user is not logged in
        // or http request fails
    });

说明:

您的getUser方法定义如下:

authFactory.getUser = function () {
    if (AuthToken.getToken())
        return $http.get('/api/me', { cache: true });
    else {
        return $q.reject({ message: 'User has no token.' });
    }
} 

successerror速记方法特定于$http。它们不存在于angular的promise $q API中。因此,当用户登录时,由于您要返回$q承诺,因此您获得了undefined is not a function

您可以在$q承诺对象上调用的方法是(link to documentation):

  • then(successCallback, errorCallback, notifyCallback)
  • catch(errorCallback)这是promise.then(null, errorCallback)
  • 的简写
  • finally(callback, notifyCallback)