`
JerryWang_SAP
  • 浏览: 1030966 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

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

阅读更多

 

背景

有时我们能在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

    Ajax-jinqu-odata.zip,金曲OData实现,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新加载网页的情况下更改。

    odata-v4-ng:Angular的OData服务

    odata-v4-ng 该项目是Angular2 +的客户端OData V4打字稿库。 目的是创建一个易于理解的用于在Angular2 +中查询,创建,更新和删除OData资源。安装要安装软件包,请使用npm install --save odata-v4-ng进口import { ...

    OData-OpenAPI-Converter:当提供OData服务的服务根URL时,OData to OpenAPI Converter会生成一个交互式图形界面,该界面将OData服务的功能描述为一组单独的端点。 该工具利用了OData服务的元数据文档,并基于该文档生成了一个摇摇欲坠的规范。 终于在Swagger UI上查看了这个swagger规范

    OData到OpenAPI转换器OData to ... 然后导航到%REPOSITORY_ROOT%/odata-openapi-converter文件夹cd odata-openapi-converter 运行以下命令来编译代码mvn clean install在Tomcat服务器上部署工具将%REPOSITORY_ROOT%/o

    odata_parser-2.3.3.zip

    "odata_parser-2.3.3.zip" 是一个这样的开源项目,它包含了对OData协议的数据解析功能,而OData是一种用于访问和共享数据的开放标准。这个压缩包中的主要文件是"Ammonite-master",这表明项目与Ammonite有关,...

    jinqu-odata::u6708:Jinqu OData实现

    jinqu-odata-Javascript-Linq到Odata Jinqu-odata使您可以针对odata源编写LINQ查询。 对于那些不了解LINQ的人,好处是: 统一的查询语言,无论查询本地数组,odata源还是任何其他远程数据源 静态键入,Typescript...

    SAP UI5 OData开发

    在深入探讨SAP UI5 OData开发之前,需要明确几个关键点:SAP UI5是一个前端开发框架,而OData(Open Data Protocol)是一种基于Web的协议,允许创建和消费可查询和可更新的数据服务。SAP Gateway是SAP NetWeaver的一...

    OData经典入门.pdf

    实体集(Entity Set)则代表数据集合,类似于数据库表的概念,一个实体集对应一个实体类型,一个OData服务可以包含多个实体集。 OData服务的实现主要涉及以下几个方面: 1. **Service Implementation**:这是实现...

    OData Service And Windows Form Outlook Email

    "OData Service And Windows Form Outlook Email"项目展示了一个实用的桌面应用开发实例,它利用现代Web服务技术(OData)与传统的桌面环境(Windows Form)相结合,通过Outlook API实现了便捷的邮件发送功能。...

    postman-newman-automation:使用POSTMAN自动化基于OData的RESTful API

    使用POSTMAN自动化基于OData的RESTful API如何使用Postman工具运行Postman Collection? 公开亚军拖放收藏选择测试点击运行按钮如何使用Newman CLI工具运行Postman Collection? 开放式终端/ CMD 安装newman npm ...

    JAVA调用SAP ODATA服务

    在Java开发中,调用SAP ODATA服务是企业级集成和数据交换的常见场景。在实际操作中,可能会遇到一些挑战,如身份验证、请求方法的使用、跨域问题以及错误处理。以下是对这些知识点的详细说明: 1. **身份验证 (401 ...

    WebApi-OData-master.zip

    【WebApi-OData】是一个基于ASP.NET Web API的开源项目,专门用于实现ODATA协议,以便为Web应用程序提供数据服务。ODATA(Open Data Protocol)是一种面向数据的服务协议,它允许用户通过HTTP协议来创建、读取、更新...

    simple-odata4:简单的OData v4服务器使用示例。 (使用Apache Olingo Spring Boot h2数据库)

    简单数据4 简单的OData v4服务器使用示例。 (使用Apache Olingo / Spring Boot / h2数据库) 尝试运行简单的示例 Spring Boot Web服务器 mvn clean install spring-boot:run 运行查询 $元数据 ...

    JAVA调用SAP ODATA服务.docx

    ### JAVA调用SAP ODATA服务的关键知识点 在IT领域,特别是企业级应用开发中,Java与SAP系统的集成是一项非常重要的技术。SAP提供了多种API和服务来促进与其他系统的交互,其中ODATA(Open Data Protocol)是一种轻...

    OData-base-example:在纯PHP上创建OData服务的示例

    在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-pyodata:适用于企业的Python OData客户端

    Python OData客户端-pyodata ...您唯一需要做的就是导入pyodata Python模块,并为库提供一个实现与Session Object兼容的接口的对象。 import requests import pyodata SERVICE_URL = 'http://services.odata

    angular-with-odata-example:使用 angularjs 使用 odata 的示例

    标题中的“angular-with-odata-example”表明这是一个关于使用AngularJS框架与OData协议进行数据交互的示例项目。AngularJS是Google维护的一款强大的前端JavaScript框架,用于构建动态Web应用程序。而OData(开放...

    OData Framework 3.0 英文

    ### SAP OData Framework 3.0 英文资料解析 #### 概述 根据所提供的文档信息,本资料主要介绍的是SAP Mobile Platform (SMP) 3.0中OData框架的相关特性及其架构设计。SAP Mobile Platform是SAP公司推出的一套用于...

    Flexberry-OData-Server-Java:Flexberry OData Feed 的 Java 实现

    Flexberry-OData-Server-Java 是一个专门为Java开发者设计的实现OData协议的服务器端框架。OData(Open Data Protocol)是一种开放的数据访问协议,它允许客户端通过HTTP协议以统一的方式从各种数据源获取和操作数据...

    crm2013odata查询

    CRM 2013 OData查询是一个针对Microsoft Dynamics CRM 2013系统的重要功能,它允许开发者和用户通过OData(Open Data Protocol)接口来访问和操作CRM数据。OData是一个开放的协议,用于在Web上共享和交互数据,支持...

    SAP 后台ODATA开发步骤

    在SAP系统中,ODATA是一种基于RESTful协议的Web服务技术,用于提供与后端业务数据的交互接口。本文将详细介绍SAP后台ODATA开发的步骤,供初学者参考。 **一、数据结构** 在SAP ODATA开发中,首先需要定义数据结构,...

Global site tag (gtag.js) - Google Analytics