Angular $q.reject().success(),这有意义吗?
Angular $q.reject().success(), does that make sense?
我正在阅读一本名为 MEAN Machine 的书,当我读到后面的章节时,我卡在了一个示例应用程序上,但它并没有' 似乎工作。
问题似乎是因为我的mainController调用了authService的Auth.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.' });
}
}
但是 success
和 error
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)
我正在阅读一本名为 MEAN Machine 的书,当我读到后面的章节时,我卡在了一个示例应用程序上,但它并没有' 似乎工作。
问题似乎是因为我的mainController调用了authService的Auth.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.' });
}
}
但是 success
和 error
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)