chrome.webRequest redirectUrl,其中包含在chrome.storage.local中保存的URL

mil*_*7en 2 javascript google-chrome google-chrome-extension google-chrome-devtools

我试图拦截Web请求并将它们重定向到我已保存在本地存储上的URL,但它无法正常工作.我的代码如下:

chrome.webRequest.onBeforeRequest.addListener(
    function (details) {
        if (details.url === 'http://myapp.com/theurl') {
            chrome.storage.local.get("http://myapp.com/theurl", function (result) {
                return { redirectUrl: result.savedUrl }; //savedUrl property is the modified Url
            });
        }
    }, { urls: ["<all_urls>"] }, ["blocking"]);
Run Code Online (Sandbox Code Playgroud)

硬编码return语句/ url的工作原理:

chrome.webRequest.onBeforeRequest.addListener(
    function (details) {
        if (details.url === 'http://myapp.com/theurl') {
                return { returnUrl : 'http://myapp.com/modifiedurl' };
            });
        }
    }, { urls: ["<all_urls>"] }, ["blocking"]);
Run Code Online (Sandbox Code Playgroud)

ber*_*err 5

chrome.storageAPI是异步的,所以,你正在服用这里的做法是行不通的.您所拥有的代码所发生的事情的基本贯穿是:

  1. 在webrequest之前,检查网址是否是 http://myapp.com/theurl
  2. 如果是,则进行异步调用 chrome.storage.local.get
  3. chrome.storage.local.get调用中的代码(即return语句)不会立即执行,并且会在稍后的某个时间运行
  4. 您的其余代码将继续运行,并且您的webRequest侦听器不会返回任何内容

有几种方法可以使这项工作.最简单的方法是在加载扩展时将本地存储的值存储在某个变量中(比如说,调用它storage_cache).然后从webRequest监听器中你可以说return { redirectUrl: storage_cache.savedUrl };

如果您的存储将经常更改,那么有比这更好的方法......但是,对于您选择的任何实现,要记住的关键是不要混淆同步和异步事件.