AngularJS UI-Router的resolve无法解析返回的deferred.promise问题
解决UI-Router resolve无法解析deferred.promise的问题
嘿,我一眼就看出问题出在哪了——你现在的代码里,authorizationService.getLdapGroup()返回的是一个Promise对象,而不是同步返回的ldap组名字符串。你直接拿这个Promise去和'AdOps'做比较,其实是在拿一个对象和字符串比,结果肯定不对,而且UI-Router的resolve机制需要你返回Promise来等待异步操作完成,不然它会直接把错误的布尔值当成解析结果,这时候实际的ldap组信息还没拿到呢!
你之前注释掉的.then逻辑才是正确的方向,只是你把它注释掉了。咱们把它恢复过来,并且确保返回整个Promise链,这样UI-Router就会自动等待异步操作完成,再把正确的isAdOps值注入到你的组件里。
修正后的app.js代码如下:
$stateProvider.state('home', { url: '/', component: 'homeComponent', params: { selectedFilter: undefined }, resolve: { isAdOps: function (authorizationService) { // 返回Promise链,让UI-Router等待异步请求完成 return authorizationService.getLdapGroup() .then(function(ldapGroup) { console.log("实际获取到的ldapGroup:", ldapGroup); return ldapGroup === 'AdOps'; }, function () { // 保持你原来的错误处理逻辑:出错时默认返回true return true; }); } } })
为什么原来的写法会失效?
authorizationService.getLdapGroup()是异步操作(比如调用后端接口、异步读取本地存储),所以它返回的是一个Deferred Promise对象,而不是直接返回组名。你之前直接把这个Promise赋值给ldapGroup,然后做比较,本质上是在判断Promise对象 === 'AdOps',结果必然是false,而且这时候异步操作还没完成,完全没拿到真实的组名。- UI-Router的resolve函数有个特性:如果返回的是Promise,它会等待Promise被resolve或reject后,才会继续加载对应的组件;如果返回普通值,就直接用这个值。你原来的写法相当于提前返回了错误的布尔值,完全没利用到Promise的异步等待机制。
只要确保在resolve里返回完整的Promise链,UI-Router就能正确解析异步操作的结果,你的isAdOps值也会是基于真实ldap组名的判断结果了。
内容的提问来源于stack exchange,提问作者Elad Benda2
相关产品推荐
相关产品推荐

