我试图根据存储在chrome.storage.local中的数据阻止我的Google Chrome扩展程序中的某些网络请求。 但是我找不到返回“{cancel:true};”的方法。在onBeforeRequest.addListener的回调函数中。或者,由于chrome.Storage.local.get()的异步方式,从其各自的回调函数之外的storage.local访问数据。
这是我的相关代码。
chrome.webRequest.onBeforeRequest.addListener( function(info) {
chrome.storage.local.get({requests: []}, function (result) {
// depending on the value of result.requests.[0].item I want to return "{cancel: true };" in order to block the webrequest
if(result.requests.[0].item == 0) return {cancel: true}; // however this is obviously in the wrong place
});
// if I put return {cancel: true} here, where it should be, I can't access the data of storage.local.get anymore
// if(result.requests.[0].item == 0) return {cancel: true};
});
有没有人解决这个问题?谢谢你的帮助。
答案 0 :(得分:2)
你可以交换回调:
chrome.storage.local.get({requests: []}, function (cache) {
chrome.webRequest.onBeforeRequest.addListener(function (request) {
if(cache.requests[0].item === 0)
return { cancel: true };
});
});
这是有道理的,因为您不是在每个请求上请求存储,而是仅在内存中存储后侦听请求。
此方法的唯一缺点是,如果您在开始收听后更新存储,则不会生效。
要解决此问题,请删除侦听器并重新添加:
var currentCallback;
function startListening() {
chrome.storage.local.get({requests: []}, function (cache) {
chrome.webRequest.onBeforeRequest.addListener(function (request) {
currentCallback = this;
if(cache.requests[0].item === 0)
return { cancel: true };
});
});
}
function update() {
if (typeof currentCallback === "function") {
chrome.webRequest.onBeforeRequest.removeListener(currentCallback);
currentCallback = null;
}
startListening();
}