背景

有时我们能在Chrome开发者工具的Network tab里观察到SAP UI5应用会发出某些状态为"取消"的OData请求。如下图第五个请求。

之前有一种似是而非的说法:极短时间内发送两个OData请求,则第一个会自动被cancel掉。

这个说法从字面上看,有两点值得推敲:

1. cancel掉,被谁cancel掉?UI5框架还是Chrome?

2. “极短”,多短算极短?

我用代码在for循环里一共发10个OData请求:

无论是同步还是异步,都没有任何的请求被cancel。

10个同步请求:

10个异步请求:

就算发100个request都不会有一个request被cancel:

验证结果,之前的说法“极短时间内发送两个OData request,前一个会自动被cancel掉”是错误的。

那再回到本文第一张图观察到的cancel的场景, 原因究竟是什么?

观察产生了被取消的OData请求的应用代码,观察到第523行有这个refresh操作:

在这个方法的第601行,bChangeDetected变量为true导致abortPendingRequest的调用。

abortPendingRequest的注释已经很清楚地说明问题了。

什么情况下会导致AbortPendingRequest? 直接使用Chrome开发者工具的全文搜索得到答案:OData model的三个API: filter, sort, refresh

下面是我的同事Li Ben的进一步补充。

关于这个现象发生的原因和条件的问题

1. 在哪里可以看到这个cancel现象?

在我们的live search功能上,如果输入较快或者正常速度输入,会看到前面很多输入请求都会被cancel掉:

如果输入较慢则不会:

真的是快慢的原因吗?

仔细观察network发现,真正的原因是当上一次的network还处于pending状态的时候,继续输入发起的请求就会cancel掉上一次的请求:

继续深究, 这是在哪里做到的?

在SAP UI5的OData框架里面有这样的实现:

在ODataModel.js中维护了一个http request的pending list,将已经发送但是还没有收到响应的request对象都缓存在这个列表中:

每次发起OData请求的时候都会调用ODataModel的_request()方法,这个方法会把当前的request加到pending list中,并且通过一个wrap method包装回调函数,确保在响应返回的时候首先把缓存的request对象从pending list中拿掉:

每次在OData Model上发起filter, sort, refresh操作的时候,都会检查是否存在pending的request对象,如果存在未完成的请求,abort掉它:

回答上面的问题,在什么情况下会发生这种现象?

1. 同一个ODataModel的instance上发出的连续请求,因为pending list是缓存在this级别上面的。

2. 前一个Http请求的network还处于pending status的时候。

3. 就读ODataModel的代码和观察到的现象,在ODataModel上发起filter, sort或者refresh的时候。

为什么在OData的request对象上发起abort调用就可以取消底层的network call?

简单的说,UI5里面的OData Request对象是底层的Ajax Request对象XmlHttpRequest的一个代理,在ODataModel的_submit方法中:

具体实现是UI5中利用了一个第三方的库datajs,datajs最终会调用浏览器的底层http对象XMLHttpRequest:

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙":

谣言粉碎机 - 极短时间内发送两个Odata request,前一个会自动被cancel掉?相关推荐

  1. SAP UI5 OData谣言粉碎机:极短时间内发送两个Odata request,前一个会自动被cancel掉吗

    这是Jerry 2021年的第 9 篇文章,也是汪子熙公众号总共第 280 篇原创文章. 本文Jerry原本写于2016年5月,当时发布于团队内部wiki. 五年过后,Jerry使用的开发框架,从SA ...

  2. 为拯救爸妈朋友圈,达摩院造了“谣言粉碎机”

    生命不可能从谎言中开出灿烂的鲜花. 前几天,母上大人给我发了条消息,再三叮嘱帮忙扩散,随手解救癌症患者. "速转!科学家发现:一味中药48小时可杀死60%癌细胞!" 回复框里,我打 ...

  3. 刚刚,阿里发布AI谣言粉碎机,识别准确率达81%

    今天,阿里巴巴重磅推出了一项黑科技产品--AI谣言粉碎机,据称可以识别假新闻和网络谣言,并且在一些场景下准确率高达81%.不仅是阿里,今天各大科技公司也大开脑洞,先后发布多项黑科技,天马行空的想象让人 ...

  4. 为拯救爸妈朋友圈,达摩院造了“谣言粉碎机” 1

    生命不可能从谎言中开出灿烂的鲜花. 前几天,母上大人给我发了条消息,再三叮嘱帮忙扩散,随手解救癌症患者. "速转!科学家发现:一味中药48小时可杀死60%癌细胞!" 回复框里,我打 ...

  5. 美国返还中国文物,阿里谣言粉碎机获奖,教育部规范研究生培养,腾讯严打微信跑分活动,推动降低港澳漫游费,这就是今天的大新闻。...

    今天是3月1日 农历正月廿五 今天星期五 相信大家 都很舍不得放下工作 下面是今天的大新闻 美国返还361件中国文物 (中国日报)当地时间2月28日,美国政府向中国返还361件(套)流失文物.这些中国 ...

  6. 云重磅 | 阿里巴巴平均每天纳税超1.4亿;谷歌、Face book与AWS将共建美欧新海底电缆;阿里发布谣言粉碎机:1秒辨真伪...

    戳蓝字"CSDN云计算"关注我们哦! 嗨,大家好,重磅君带来的[云重磅]特别栏目,如期而至,每周二第一时间为大家带来重磅新闻.把握技术风向标,了解行业应用与实践,就交给我重磅君吧! ...

  7. html post 发送两次,JS发送跨域Post请求出现两次请求的解决办法

    为什么 post 请求会出现两次请求? 跨域请求就会出源现这样的问题. 由于CORS(cross origin resource share)规范的存在,浏览器会首先发送知一次options嗅探,同时 ...

  8. ajax 跨域请求,每次会发送两个请求?

    2019独角兽企业重金招聘Python工程师标准>>> 跨域已经是个老话题了,但是最近搞百度的语音接口的时候,在服务端配置了 CORS ,跨域倒是没问题,但是每次都会发送两个请求: ...

  9. 几个数判断大小_许栩原创2020读书笔记2《魔鬼数学》:极小数的两倍仍然是极小数...

    前几天未复工时,终于看完了<魔鬼数学>.这本书的作者是[美]乔丹·艾伦伯格(Jordan Ellenberg),由中信出版社出版. 这本书的副标题为"大数据时代,数学思维的力量& ...

最新文章

  1. javascript对表单的操作
  2. Qualcomm thermal的介绍
  3. 忧云:喻红艺术展观后
  4. iOS开发tableview二级联动的细节实现中注意的细节总结
  5. Spring MVC 登录拦截器
  6. ASP.NET MVC +EasyUI 权限设计(三)基础模块
  7. es6 Proxy 的 this 问题
  8. Application和Console Application
  9. 阿拉丁指数丨《2021 年度小程序互联网发展白皮书》4.5 亿+DAU 小程序的 6 大发展趋势
  10. 学习PS2无线手柄解码通讯手册
  11. html、css做一个带搜索图标的搜索框(方法分享)
  12. 交换机修改dhcp服务器ip范围,华为s5700交换机配置全局地址池dhcp服务器.doc
  13. 生鲜电商:卖什么?卖给谁?怎么卖?
  14. 我的科幻杂谈1:不读史,无以言
  15. 相机去畸变软件OCamCalib的使用方法
  16. html 块元素 css,HTML和CSS - 内嵌块元素的问题
  17. 【Java】JRE与JDK
  18. 日志版本问题:Your binding is version 1.5.5 or earlier.Upgrade your binding to version 1.6.x.
  19. 你曾后悔进入 IT 行业吗?为什么?(转自知乎)--一生不悔入IT
  20. Linux任务管理与守护进程

热门文章

  1. 【统计学习方法】感知机笔记
  2. 如何通俗的理解KKT条件
  3. 时间序列研(part5)--四种典型的非平稳随机过程
  4. 文献记录(part40)--An adversarial human pose estimation network injected with graph structure
  5. 鸿蒙生态系统第一梯队,鸿蒙系统9月11日,将有望正式成为国际第三大手机操作生态系统...
  6. SAP UI5 应用开发教程之五十八 - 使用工厂方法在运行时动态创建不同类型的列表行项目控件试读版
  7. 一些技术社区关于博客内图片 markdown 源代码的字数统计
  8. SAP Spartacus B2B页面unit tree取数据的设计逻辑
  9. 关于SAP Spartacus嵌套label的padding问题
  10. SAP Spartacus的User明细如何通过ngrx-store-devtools被解析出来