看來,我發現自己在一個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一起使用)
這完全不可能。你不能神奇地獲得一個尚不存在的價值。 – SLaks
[如何從AJAX調用返回響應?](http:// stackoverflow。com/questions/14220321/how-to-return-the-a-ajax-call) –
您不能以同步方式使用異步操作。您必須將所有需要響應的代碼放入成功處理程序中,或者必須從那裏調用一個函數並將數據傳遞給它。您不能「等待」完成請求。這不是異步請求在javascript中的工作方式。更多信息的重複鏈接。這個問題已經被問及答覆了數百次。 – jfriend00