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

Angular $q.reject().success(), does that make sense?

我正在阅读一本名为 MEAN Machine 的书,当我读到后面的章节时,我卡在了一个示例应用程序上,但它并没有' 似乎工作。

问题似乎是因为我的mainController调用了authServiceAuth.getUser()方法,可能return $http.get()$q.reject()。由于我没有登录,它 returns $q.reject(),并且无法链接 .success() 承诺。

它抛出以下异常:

TypeError: undefined is not a function at mainCtrl.js:13

我的代码如下


控制器
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.' });
            }
        }

我错过了什么?

将您对服务的调用替换为:

方案一:.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 shorthand 方法特定于 $http。它们不存在于 angular 的承诺 $q API 中。因此,当用户 登录时,因为您正在返回 $q 承诺,所以您得到了 undefined is not a function.

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

  • then(successCallback, errorCallback, notifyCallback)
  • catch(errorCallback)promise.then(null, errorCallback)
  • 的 shorthand
  • finally(callback, notifyCallback)