【问题标题】:Angular $q.reject().success(), does that make sense?Angular $q.reject().success(),这有意义吗?
【发布时间】:2015-05-16 23:33:44
【问题描述】:

我正在阅读一本名为 MEAN Machine 的书,当我进入最后几章时,我遇到了一个示例应用程序,这似乎不起作用.

问题似乎是因为我的mainController 调用了authServiceAuth.getUser() 方法,该方法可能返回$http.get()$q.reject()。由于我没有登录,它返回$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.' });
            }
        }

我错过了什么?

【问题讨论】:

  • 您是否在Auth 中定义了.isLoggedIn() 方法?
  • 嗨@JLRishe。是的,它已经定义了。当它尝试在从 $q.reject() 返回时调用 .success() 时,确实会出现问题。但是感谢您的宝贵时间。

标签: javascript angularjs promise angular-promise


【解决方案1】:

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

解决方案 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 promise 对象上调用的方法是 (link to documentation):

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

【讨论】:

  • 非常感谢您的解决方案和解释!它解决了问题。
猜你喜欢
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 2014-08-21
  • 2016-05-26
  • 2011-06-20
  • 2016-12-29
相关资源
最近更新 更多