背景
有时我们能在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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:
相关推荐
Ajax-jinqu-odata.zip,金曲OData实现,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新加载网页的情况下更改。
odata-v4-ng 该项目是Angular2 +的客户端OData V4打字稿库。 目的是创建一个易于理解的用于在Angular2 +中查询,创建,更新和删除OData资源。安装要安装软件包,请使用npm install --save odata-v4-ng进口import { ...
jinqu-odata-Javascript-Linq到Odata Jinqu-odata使您可以针对odata源编写LINQ查询。 对于那些不了解LINQ的人,好处是: 统一的查询语言,无论查询本地数组,odata源还是任何其他远程数据源 静态键入,Typescript...
OData到OpenAPI转换器OData to ... 然后导航到%REPOSITORY_ROOT%/odata-openapi-converter文件夹cd odata-openapi-converter 运行以下命令来编译代码mvn clean install在Tomcat服务器上部署工具将%REPOSITORY_ROOT%/o
使用POSTMAN自动化基于OData的RESTful API如何使用Postman工具运行Postman Collection? 公开亚军拖放收藏选择测试点击运行按钮如何使用Newman CLI工具运行Postman Collection? 开放式终端/ CMD 安装newman npm ...
在www目录中: $ git clone https://github.com/qeti/OData-base-example.git 之后运行composer install 。 使用表和测试数据创建数据库: CREATE TABLE product ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY , ...
Python OData客户端-pyodata ...您唯一需要做的就是导入pyodata Python模块,并为库提供一个实现与Session Object兼容的接口的对象。 import requests import pyodata SERVICE_URL = 'http://services.odata
Flexberry-OData-Server-Java Flexberry OData Feed 的 Java 实现。
SAP-odata文档
Aspnet-aspnet-odata-sample.zip,asp.net odata web应用程序示例.aspnet-odata-sample,asp.net是一个开源的web框架,用于使用.net构建现代web应用和服务。asp.net创建基于html5、css和javascript的网站,这些网站...
一个采用OData的Windows Form窗体程序的客户端,使用Outlook API通过OData服务进行发送邮件的小系统
angular-with-odata-example
WebApi-OData
-- NOTE: not minified version - https://unpkg.com/odata-filter-builder@1.0.0/dist/odata-filter-builder.js --> < script src =" ...
JAVA调用SAP ODATA服务.docx
OData Producer Codegen for JDBC(odata-codegen)可以批量自动将JDBC后端数据源快速转换为OData服务。 使数据服务使用者能够通过标准 OData 客户端(如 MS Office Excel)轻松访问数据。 该工具旨在提高数据服务...
解决方法:要先用GET方法从去调用ODATA中GET_ENTIY方法,例如:http://vhcals4h.com:44301/sap/opu/odata/sap/ztest_srv/HEADERSet('5000000001'),然后再将返回内容作为表身,传到ENTITYSET地址,如:...
SAP OData Framework 3.0 英文资料
OData 是一种网络数据交互技术,它规定了数据的结构模型和访问规则。...XML, JSON 等多种网络标准技术的,所以它支持各种平台,...用的交互技术, 也被称为 OData 服务, 想具体了解 OData 可以去 odata.org 这个网站。