我正在读一本名为 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.' });
}
}
我错过了什么?
答案 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.' });
}
}
但success
和error
速记方法特定于$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)