Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将js函数从异步调用转换为回调调用_Javascript_Google Chrome Extension - Fatal编程技术网

Javascript 如何将js函数从异步调用转换为回调调用

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

我正在尝试做我的第一个谷歌浏览器扩展。此扩展必须拦截对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
}
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中这样做)