[英]How to turn js functions from asynchronious calling to callback calling
我正在嘗試制作我的第一個Google Chrome擴展程序。 此擴展名必須攔截對mysite.com的請求,並將用戶重定向到站點鏡像之一(例如,mymirror.com)。 從我的API服務器(例如api.service.com)獲取的第一個被攔截請求的實際鏡像擴展的URL,並將其存儲到Cookie以供下一個請求。
manifest.json :
{
"name": "InterceptMySite",
"version": "0.1",
"description": "My first Chrome extension",
"permissions": ["webRequest", "webRequestBlocking", "cookies",
"*://mysite.com/*", "*://api.service.com/*"],
"background": {
"scripts": ["background.js"]
},
"manifest_version": 2
}
background.js :
function setMirrorUrl(callback) {
var req = new XMLHttpRequest();
req.open('GET', 'http://api.service.com', false); // sync request
req.send(null);
req.onload = function() {
callback(this.getResponseHeader('Mirror-Url'));
}
}
function getMirrorUrl(callback) {
chrome.cookies.get({url:'http://api.service.com',name:'mirror_url'}, function(cookie) {
if ( ! cookie)
return setMirrorUrl(callback);
else
return callback(cookie.value);
});
}
chrome.webRequest.onBeforeRequest.addListener(
function(info) {
if(info.url.indexOf('api.service.com') != -1)
return {cancel:false};
getMirrorUrl(function(mirror_url){
return {redirectUrl: info.url.replace(/mysite.com/i, mirror_url)};
});
},
// filters
{
urls: [
"*://mysite.com/*",
"*://api.service.com/*"
]
},
// extraInfoSpec
["blocking"]
);
除了一件事情之外,所有方法都工作正常: getMirrorUrl()異步調用。 因此, onBeforeRequest事件偵聽器在getMirrorUrl()完成之前完成。 另外,getMirrorUrl必須以某種方式將結果傳遞給onBeforeRequest偵聽器。
我知道必須將其重寫為回調樣式,但我不知道如何。
您正在執行的是回調樣式! 您需要一個cookie,並通過回調異步獲取它。
您可以同步進行API調用(盡管這很丑陋),但是cookie“ get”操作必須是異步的。 因此,我認為您需要預先預加載鏡像URL(例如,一旦頁面加載完成),然后在單擊鏈接時檢索相應的URL。
我嘗試的另一種方法是將redirectUrl
設置為當前頁面,異步加載鏡像URL,並在加載頁面后立即觸發頁面更改(我不確定,我從未從擴展API進行過更改) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.