你这个问题看似简单,但实际上有点模糊:“run 只运行一次”这个先觉条件到底有什么影响呢?

看了半天我才明白你真正的问题在于你要知道用户的登录状态是否还有效,因为 SPA 应用不需要刷新页面,所以你的 run 只有运行一次的机会,因而如果用户不刷新浏览器且使用了很长时间(可能超过了 session 的有效期)那么你无法判断用户的登录还是否有效了。我说的没错吧?

实际上你这个问题根源不在前端,而在后端的 API 那里。如果你是 session 验证且会过期失效,那么失效与否不应该是用一个固定的 API Endpoint(也就是你例子里的 app.URL.login)来检查,而是应该在每一次 API 请求里都检查,并且如果 session 失效就返回给客户端一个特定的信息。

接下来就像 @dolymood 说的那样,在客户端用拦截器预先做好对此特定信息的处理,一旦收到就清空本地缓存的登录和用户信息然后跳转至 login。这才是解决你的问题的根本之道,和用不用 $q 以及 run 能否运行多次没有任何关系。

另外如有可能,还可以把 session 验证机制换成 token 验证机制,它好处会更多一些,特别是可以避免 cookie 带来的一些烦恼。不过 token 验证判断是否失效的道理和过程也和上述类似,无论如何后端 API 总是要反馈给客户端必要的信息的,不是通过固定的接口去“拉”这个信息,而是访问任何接口的时候都把信息“推”给客户端。

如果你完全触碰不到后端,只有一个固定的 API 来帮你判断登录状态的话(好可怜),那么到还有一个方法可以让你摆脱 run 只运行一次的困扰。不过先把它的缺陷说在前头:这个机制是依赖客户端应用的状态变更的!如果你的应用里有无须状态变更就可以请求 API 的业务逻辑,那就会出现“漏网之鱼”。什么意思?比如说你的页面里有很多链接/按钮,点击它们不会改变应用的状态而是直接发起异步请求,那就没有检查登录失效的先决条件了。除非你干脆写个拦截器把所有的 HTTP 请求都加一层登录失效检查,但这样也太蠢了……

OK,说正事:

看你的代码,你应该是用了 ui-router 的,那么你是否知道 ui-router 有一个 abstract state 机制可以利用一下?细节不多说了,自己看 ui-router 的文档,反正如果你写了一个顶级的 abstract state 就意味着其他任何状态的变更都会“继承”这个顶级抽象状态的逻辑定义。这样的 state 有点类似于 run(但作用领域是不同的,我倾向于把和业务逻辑无关的但是需要在进入应用之前的动作写在 run 里,而把和业务逻辑相关的,会频繁“动作”的行为放入 abstract state),于是可以在这里做一层“登录验证保护伞”。

所以你要做两件事情:

写一个 service,内容和你放在 run 里面的代码差不多(回过头看一下你这个逻辑也还是太“蠢”了,不请求就不可能知道是否失效,不慢才怪……)

顶级抽象状态里写一个 resolve,内容就是使用这个 service

于是其他任何状态的变化都必须先 resolve 这个“保护逻辑”,这就可以做到不依赖只运行一次的 run 了。

@dolymood 你提到的第一种情况,如果是前后分离的架构,后端是没有条件往页面里写信息的;即使可以也还是无法判断登录状态是否有效,因为 SPA 不刷新的……

@M_J 理解“状态”这个概念对于写 SPA 是至关重要的,就拿本问题来说吧,你之所以卡在 “run 只能运行一次该怎么办” 这个坑里,就是因为你没有意识到 run 和应用状态变化是无关的,它只负责应用整体的初始化逻辑。而你要的有效性检查则伴随着应用状态的变化而进行,所以你和 run 较劲就是“问道于盲”了。

angularjs 同步請求_AngularJS 应用请求设置同步问题~相关推荐

  1. angularjs 同步請求_angularjs $q、$http 处理多个异步请求

    在实际业务中经常需要等待几个请求完成后再进行下一步操作.但angularjs中$http不支持同步的请求. 解决方法一: $http.get('url1').success(function (d1) ...

  2. ajax请求设置同步,ajax 设置同步

    这个问题总是碰见,但是又总是记不住怎么拼写,这次直接写出来,长期保存. Ajax请求默认的都是异步的 如果想同步 async设置为false就可以(默认是true) 例如: $.ajax({ url: ...

  3. 怎样让云盘和服务器同步更新,百度云网盘怎么设置同步文件夹、怎么进行文件同步?...

    类型:下载工具大小:1.5M语言:中文 评分:3.7 标签: 立即下载 百度云PC客户端的基本功能是自动同步.您不必手动进行上传下载,只需在登录时设置一个同步文件夹即可,客户端将对这个文件夹里的文件和 ...

  4. 架构设计|异步请求如何同步处理?

    来自:程序通事 本文创意来自一次业务需求,这次需要接入一个第三方外部服务.由于这个服务只提供异步 API,为了不影响现有系统同步处理的方式,接入该外部服务时,应用对外屏蔽这种差异,内部实现异步请求同步 ...

  5. ajax 同步异步true,async: false 实现AJAX同步请求 ( $.ajax同步/异步(async:false/true) )(示例代码)...

    虽然说ajax用来执行异步请求的比较多,但有时还是存在需要同步执行的情况的. 比如:我需要通过ajax取执行请求以返回一个值,这个值在ajax后面是需要使用到的,这时就不能用异步请求了.这时候就需要使 ...

  6. Jquery中进行post请求时同步与异步的区别(从实例入手学习)

    场景 表单中有两个输入框input在提交这个表单前需要对两个输入框进行校验. 即点击提交按钮时会经过校验的方法,此方法会post方式提交到后台,在请求后台成功后的回调方法中会对js变量进行赋值,进而决 ...

  7. AngularJS $http 异步后台无法获取请求参数

    angular在通过异步提交数据时使用了与jquery不一样的请求头部和数据序列化方式,导致部分后台程序无法正常解析数据.   原理分析(网上的分析): [javascript] view plain ...

  8. java angularjs 跨域访问_angularjs跨域post解决方案

    AngularJS实现跨域请求跨域,前端开发中经常遇到的问题,AngularJS实现跨域方式类似于Ajax,使用CORS机制.下面阐述一下AngularJS中使用$http实现跨域请求数据.Angul ...

  9. http 请求 与其同步与异步请求的通透讲解

    http请求可以是基于webkit的浏览器或者web组件如:webview(在移动平台,android iOS等)发送的:也可以是任何程序或者代码段发出的:也可以这么说任何程序都可以自主发送http. ...

最新文章

  1. Linux平台下QtCreator集成代码静态分析工具clang-tidy和Clazy
  2. 联邦学习首个国际标准正式发布
  3. IT人士必备五大绿色健康生活用品
  4. MySQL数据同步,出现Slave_SQL_Running:no和slave_io_running:no问题的解决方法
  5. jQuery.ready() 函数详解
  6. linux 不同ip 相同mac arp,linux – nmap和arp-scan不一致的IP-MAC结果
  7. 利用windows 2003 实现×××服务器的组建与架构(一) 移动用户到站点之间的×××...
  8. 全虚拟化和半虚拟化的区别 cpu的ring0~ring3又是什么概念?
  9. QPW 点评点赞日志表(tf_appraise_praise)
  10. 计算机原理2408,《计算机组成原理实验》课程教学大纲
  11. 7-4 求下一天 (30 分)
  12. mysql 查询 in memory_In-Memory整体汇总
  13. 你知道这5年我怎么过的吗!谈谈我做测试开发的这些年……【总结】
  14. 结对编程-黄金点游戏之旅[二]
  15. spring-data-elasticsearch 引入es版本适配
  16. 【笔记】排列组合公式、二项式定理
  17. Echarts 3d地球toolstips实现
  18. 制作启动U盘后出现“CD驱动器”问题
  19. Adobe国际认证|3D产品可视化:赢得内容竞赛的关键
  20. soft lockup的分类和定位方法

热门文章

  1. 下载Android App的历史版本
  2. 埃森哲2021财年第三季度全球营收达133亿美元;富士胶片创新解决方案新成员亮相CHINA PRINT 2021 | 全球TMT...
  3. 互联网+背景下给旅行社的重大挑战
  4. KSO-.NET 6 中的新增功能
  5. [c++]实现分数计算器设计
  6. python中的matplotlib用法
  7. 项目实战-Medis测试用例
  8. STM32的0.96寸OLED显示屏显示数据
  9. OkHttp优点及工作原理
  10. 右键新增文件/文件夹-打开方式