gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 05:12:16 26 4
gpt4 key购买 nike

我正在阅读一本名为 MEAN Machine 的书,当我读到后面的章节时,我卡在了一个示例应用程序上,它似乎不起作用.

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

它抛出以下异常:

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

我的代码如下。


Controller
主 Controller

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

我错过了什么?

最佳答案

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

解决方案 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 promise,您得到一个undefined is not a function

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

  • 然后(successCallback, errorCallback, notifyCallback)
  • catch(errorCallback) 这是 promise.then(null, errorCallback)
  • 的简写
  • 最后(回调,notifyCallback)

关于javascript - Angular $q.reject().success(),这有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29049964/

26 4 0