1

看來,我發現自己在一個catch 22使用重定向用戶chrome.webRequest取決於服務器的響應

我正在使用的延伸Chrome Web Request事件讓所有的web請求這樣的URL:

chrome.webRequest.onBeforeRequest.addListener(
      function(request) { 
       var cat = getCategory(request.url); 
       if(cat == "1") { 
         return {redirectUrl: "http://google.com"} 
        } else { 
         return {cancel: false} 
        } 
       } 
}); 

然後,我想查詢我的服務器使用PHP來獲取URL的類別。如果它有一個類別1,我想阻止它,如果它有一個類別0,我想允許請求通過。

我看到的一個大問題是,因爲getCategory函數中存在AJAX請求,所以它不會返回值,並且執行會像平常一樣繼續。我需要找到一種方法來阻止執行,直到返回實際上以某種方式收到,但我不確定如何做到這一點,同時仍然能夠將重定向URL返回給偵聽器函數。

除了無法通過同步AJAX請求設置超時外,同步請求幾乎可以工作。因此,如果我們的服務器出現故障,所有人的網絡請求將被阻止,無論類別如何 - 這並不理想。

function getCategory(url) { 
    request = $.ajax(// params); 
    request.done(function) 
// this code executes even before the done block finishes 
} 

我試過使用AJAX綁定,如當前在這裏使用的.done()函數。我也試過尋找方法來使同步請求超時,並使用.when()。然後()函數組合,但我無法找到一種方法來返回在這些正確的範圍內的值。

有沒有一種方法,我可以從ajax請求這個值到外部函數?我見過的所有嘗試都有錯誤的返回範圍。有誰知道這是否有可能?

關於重構代碼的想法也被接受了! (只要它能與chrome.webRequest一起使用)

+0

這完全不可能。你不能神奇地獲得一個尚不存在的價值。 – SLaks

+0

[如何從AJAX調用返回響應?](http:// stackoverflow。com/questions/14220321/how-to-return-the-a-ajax-call) –

+0

您不能以同步方式使用異步操作。您必須將所有需要響應的代碼放入成功處理程序中,或者必須從那裏調用一個函數並將數據傳遞給它。您不能「等待」完成請求。這不是異步請求在javascript中的工作方式。更多信息的重複鏈接。這個問題已經被問及答覆了數百次。 – jfriend00

回答

0

你不會從中得到太多東西。

在您理想的情況下,Chrome在內部構建了特定的例外接受基於承諾的返回值。

我懷疑是這種情況,但您可以隨時檢查API文檔以提及接受承諾或「可接受」。

更可能的解決方案是,您需要將整個"category-1"請求列表拉到客戶端代碼中。

這將不得不放入程序中的對象/數組中,或放置在localStorage之內。
由於您使用的是Chrome擴展程序,因此我會假設localStorage可能在此處可用。

此外,雖然localStorage將工作,WebSQL(死)和IndexedDB將無法正常工作,因爲他們也是異步訪問(即使數據存儲在那裏,由客戶端的瀏覽器)。

這是你的選擇,在這一點上。

+0

如果第1類值的列表超過一百萬行? – user417669

+0

@ user417669然後,我建議您或者要求Google的Chrome團隊使用承諾處理功能來提供該API,或者您找到另一種解決問題域的方法,它可以*支持異步解析。如果該函數不支持生成器(它100%不)或承諾(很可能不會)作爲返回值,那麼幾乎沒有任何事情可以強制它強制鎖定執行所有JS /用戶交互的頁面上,直到您的查詢返回。 – Norguard

+0

我們想到了一種(相對)安全地使用同步請求的方法 - 哪些方法可行。檢查下面的答案!我會喜歡這個想法的任何反饋或擴展。 – user417669

相關問題