2014-06-22 25 views
4

我正在開發一個項目,我們正在優先處理資源加載的HTTP請求。爲了實現HTTP請求的重新排序,我們需要延遲HTTP請求發送或者取消它們,並在稍後重新啓動它們。如何做延遲加載網絡HTTP請求或阻止並在Firefox擴展中需要時重新啓動?

以下代碼片段可用於取消Firefox擴展中的HTTP請求。

observe: function(aSubject, aTopic, aData) { 

    if (aTopic == 'http-on-modify-request') { 

    ..... 

    aSubject.cancel(Components.results.NS_BINDING_ABORTED); 

    .... 

    } 

} 

但是,有什麼辦法拖延(資源延遲加載)的HTTP請求或重新啓動它通過上面的代碼的網頁解析過程中被取消的HTTP請求。

回答

0

首先,您不能簡單地取消請求並稍後重新啓動它們。這丟失了「綁定」信息,即什麼請求屬於哪個文檔(或從屬資源)。例如。取消圖像請求並稍後重新啓動它不會自動告訴文檔(加載程序)該請求屬於某個圖像元素。另請注意,後臺請求不是從文檔加載啓動的,也沒有附加文檔/窗口,例如更新ping或其他附加組件,用於執行API請求或下載某些文件(只是提到這一點,因爲很多人在編寫時忘記了它處理如此低級別的http請求的代碼)。

有兩種方法我能想到的,你可能工作:

  1. Use nsISupportsPriority with channels and/or load groups。這是http連接調度程序在內部使用的內容。儘管如此,另一段代碼(Firefox文檔加載器,其他附加組件)在您調用它並顛倒設置後使用此API。您需要在實施過程中對此進行說明。
  2. 您可以使用nsIRequest.suspend()/.resume(),但這可能導致連接,如果有的話,在此期間,這可能會導致與該只適用問題的鏈接來訪問一次web-app的問題被丟棄。而且IIRC有一些錯誤的場景會混淆連接調度器(但我不記得任何錯誤號碼ATM)。

對於某些請求類型,取消和重新啓動可能是可行的。例如。您可以取消圖像請求並使用驅動"Reload Image" menu item的相同機制。這對於文檔請求,腳本請求等無效(正確或完全)。