我试图拦截网络请求并将其重定向到我保存在本地存储上的网址,但它不起作用。我的代码如下:
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"]);
对return statement / url进行硬编码工作:
chrome.webRequest.onBeforeRequest.addListener(
function (details) {
if (details.url === 'http://myapp.com/theurl') {
return { returnUrl : 'http://myapp.com/modifiedurl' };
});
}
}, { urls: ["<all_urls>"] }, ["blocking"]);
答案 0 :(得分:5)
chrome.storage
api是asynchronous,所以你在这里采取的方法是行不通的。您所拥有的代码所发生的事情的基本贯彻是:
http://myapp.com/theurl
chrome.storage.local.get
chrome.storage.local.get
调用中的代码(即返回语句)不会立即执行,并会在稍后的某个时间运行有几种方法可以让你的工作。最简单的方法是在加载扩展时将本地存储的值存储在某个变量中(称之为storage_cache
)。然后从webRequest监听器中你可以说return { redirectUrl: storage_cache.savedUrl };
如果你的存储会经常变化,那么有比这更好的方法......但是你要选择的任何实现都要记住的关键是不要混淆同步和异步事件。