摘要:背景有時我們能在開發者工具的里觀察到應用會發出某些狀態為取消的請求。如下圖第五個請求。之前有一種似是而非的說法極短時間內發送兩個請求,則第一個會自動被掉。前一個請求的還處于的時候。就讀的代碼和觀察到的現象,在上發起或者的時候。
背景
有時我們能在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:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44549.html
摘要:背景有時我們能在開發者工具的里觀察到應用會發出某些狀態為取消的請求。如下圖第五個請求。之前有一種似是而非的說法極短時間內發送兩個請求,則第一個會自動被掉。前一個請求的還處于的時候。就讀的代碼和觀察到的現象,在上發起或者的時候。 背景 有時我們能在Chrome開發者工具的Network tab里觀察到SAP UI5應用會發出某些狀態為取消的OData請求。如下圖第五個請求。 之前有一種似...
摘要:背景有時我們能在開發者工具的里觀察到應用會發出某些狀態為取消的請求。如下圖第五個請求。之前有一種似是而非的說法極短時間內發送兩個請求,則第一個會自動被掉。前一個請求的還處于的時候。就讀的代碼和觀察到的現象,在上發起或者的時候。 背景 有時我們能在Chrome開發者工具的Network tab里觀察到SAP UI5應用會發出某些狀態為取消的OData請求。如下圖第五個請求。 之前有一種似...
摘要:背景有時我們能在開發者工具的里觀察到應用會發出某些狀態為取消的請求。如下圖第五個請求。之前有一種似是而非的說法極短時間內發送兩個請求,則第一個會自動被掉。前一個請求的還處于的時候。就讀的代碼和觀察到的現象,在上發起或者的時候。 背景 有時我們能在Chrome開發者工具的Network tab里觀察到SAP UI5應用會發出某些狀態為取消的OData請求。如下圖第五個請求。 之前有一種似...
摘要:達摩院的科學家們最近在用識別謠言的研究上,有了一些小突破。有始有終,皆大歡喜達摩院所研發的謠言粉碎機,在剛剛結束的全球語義測試中,創造了假新聞識別準確率的新紀錄,達到了前所未有的。謠言粉碎機技術的背后,是一次史無前例的信任重建。 showImg(https://segmentfault.com/img/remote/1460000018343265); 生命不可能從謊言中開出燦爛的鮮花...
閱讀 2222·2021-11-18 10:02
閱讀 3480·2021-11-15 11:36
閱讀 1116·2019-08-30 14:03
閱讀 725·2019-08-30 11:08
閱讀 2761·2019-08-29 13:20
閱讀 3287·2019-08-29 12:34
閱讀 1375·2019-08-28 18:30
閱讀 1642·2019-08-26 13:34