Javascript 如何将js函数从异步调用转换为回调调用
我正在尝试做我的第一个谷歌浏览器扩展。此扩展必须拦截对mysite.com的请求,并将用户重定向到其中一个站点镜像(例如mymirror.com)。从我的API服务器(例如API.service.com)获取的第一个截获请求的实际镜像扩展的URL,并将其存储到Cookie以供下一个请求使用 manifest.json:Javascript 如何将js函数从异步调用转换为回调调用,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我正在尝试做我的第一个谷歌浏览器扩展。此扩展必须拦截对mysite.com的请求,并将用户重定向到其中一个站点镜像(例如mymirror.com)。从我的API服务器(例如API.service.com)获取的第一个截获请求的实际镜像扩展的URL,并将其存储到Cookie以供下一个请求使用 manifest.json: { "name": "InterceptMySite", "version": "0.1", "description": "My first Chrom
{
"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
}
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"]
);
background.js:
{
"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
}
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 我尝试的另一种方法是将
重定向URL
设置为当前页面,异步加载镜像URL,并在加载后立即触发页面更改(我不确定,我从未在扩展API中这样做)