Angular UI-Router——在resolve中返回被拒绝的承诺并不能停止状态转换
Angular UI-Router - Returning rejected promise in resolve is not stopping state transition
我试图确保在允许用户转换到特定状态之前对其进行了身份验证。正如我所理解的那样(在审查其他帖子之后),如果状态的解析返回被拒绝的承诺并且应该引发'$stateChangeError'事件,则不应该发生状态转换。然而,这不是我所经历的。
逐步执行下面的代码,我可以看到延迟的承诺被拒绝,但状态转换仍然发生,并且没有触发'$stateChangeError'。在我的模块配置中,我有以下状态:
.state('accounts', {
url: '/Accounts',
controller: 'AccountsController',
templateUrl: 'Scripts/angular/accounts/templates/accounts.tpl.html',
resolve: {
authenticated: ['$q', 'AccountService', function ($q, accountService) {
var deferred = $q.defer();
accountService.userLoggedIn().then(function (loggedIn) {
if (loggedIn) {
deferred.resolve();
} else {
deferred.reject('Not logged in'); <-- This happens
}
return deferred.promise;
});
}]
}
})
在同一个模块中,在run函数中,我有:
$rootScope.$on('$stateChangeError',
function (event, toState, toParams, fromState, fromParams, error) {
$log.debug(error); <-- This is never called
$state.go('login');
});
我错过了什么?
您将promise返回到错误的位置。Authenticated需要是一个返回承诺的函数但你只是在。then()函数中返回承诺然后Authenticated返回undefined
resolve: {
authenticated: ['$q', 'AccountService', function ($q, accountService) {
var deferred = $q.defer();
accountService.userLoggedIn().then(function (loggedIn) {
if (loggedIn) {
deferred.resolve();
} else {
deferred.reject('Not logged in'); <-- This happens
}
});
return deferred.promise;
}]
}
你不需要创建新的deferred,因为你已经从userLoggedIn()获得了promise:
resolve: {
authenticated: ['$q', 'AccountService', function ($q, accountService) {
return accountService.userLoggedIn().then(function (loggedIn) {
if (loggedIn) {
return loggedIn;
} else {
return $q.reject('Not logged in');
}
});
}]
}
相关文章:
- Chrome原生拖放相对容器并不能正确渲染重影
- 我能处理来自gap.client.load'的错误吗;的承诺
- 包裹的咕哝声并不能让它的兄弟姐妹满意;peerDependencies要求
- Javascript承诺:它们能在用户空间代码中完全实现吗
- 我能不能早点用蓝鸟承诺打破链条
- 如何将嵌套承诺与Q连锁?我可以'Don’我不能让它们按正确的顺序运行
- Cordova:尝试添加Android平台时出现EACCES错误.更改 PATH 并不能修复它
- 移除监听器类并不能停止与Jquery Javascript相关的声音事件
- 更新D3数据并不能从仿3d示例中删除旧数据
- Angular UI-Router——在resolve中返回被拒绝的承诺并不能停止状态转换
- 第一次加载我的页面并不能正常工作
- 在.load()上获取图像宽度并不能在除firefox以外的所有浏览器上工作
- 《Redux-saga》一开始并不能奏效
- Angular:谷歌自动补全功能可以在pc上运行,但在移动设备上点击并不能加载建议
- 销毁记录实际上并不能删除它们
- 我怎么能承诺MongoDB原生Javascript驱动程序使用蓝鸟
- 对数组进行迭代并不能按顺序执行操作
- 我已经写了一个名为confirm的函数,但它并不能像我想要的那样工作
- 我怎么能承诺我写的一个简单的异步函数呢
- 使用jQuery的动画回调并不能正确更新我的Angular模型