Javascript chrome…addListener,如何等待chrome.storage.sync.get?
我的扩展正在修改一些URL。它工作正常,但现在我想检查是否在设置中启用了修改Javascript chrome…addListener,如何等待chrome.storage.sync.get?,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我的扩展正在修改一些URL。它工作正常,但现在我想检查是否在设置中启用了修改 chrome.webRequest.onBeforeRequest.addListener ( modifyUrl, {urls: ['http://somewebsite/*'], types: ['main_frame']}, ['blocking'] ); 问题是我不知道如何等待值。我必须在退出modifyUrl之前获取设置。这可能吗?如果这是C#,我可能会在调用sync.get之后使用
chrome.webRequest.onBeforeRequest.addListener
(
modifyUrl,
{urls: ['http://somewebsite/*'], types: ['main_frame']},
['blocking']
);
问题是我不知道如何等待值。我必须在退出modifyUrl
之前获取设置。这可能吗?如果这是C#,我可能会在调用sync.get
之后使用ManualResetEvent
或其他东西
function modifyUrl(details)
{
chrome.storage.sync.get("someSetting",
function (data)
{
//I can get the setting here
}
);
//how to know the setting here?
if(enabled in the setting)
{
return {redirectUrl: some different url};
}
}
有关详细说明,请参见
简而言之,blocking
onBeforeRequest事件是同步的,因此它不能依赖异步函数(如所有chrome.*API回调)来派生其返回值
将数据缓存在全局变量中,并在其他地方更改时使用更新,如果使用chrome.storage.sync(在配置文件同步时更新),则很容易发生这种情况
当然,如果要完全禁用处理,只需分离侦听器:
function toggleListener(enable) {
if (enable) {
chrome.webRequest.onBeforeRequest.addListener(
modifyUrl,
{urls: ['http://somewebsite/*'], types: ['main_frame']},
['blocking']
);
} else {
chrome.webRequest.onBeforeRequest.removeListener(modifyUrl);
}
}
chrome.storage.onChanged.addListener(function(changes, area) {
if (area == "sync" && "someSetting" in changes) {
toggleListener(changes.someSetting.newValue);
}
});
chrome.storage.sync.get("someSetting", function (data) {
toggleListener(data.someSetting);
});
另一个有趣的方法是在更新时进行设置。看起来您需要一个回调或承诺来等待异步操作,然后从函数返回这里有一个想法->@adeneo如果在注册事件侦听器后设置发生更改怎么办?@adeneo Chrome似乎只加载一次后台脚本,因此,如果我先读取设置,然后添加侦听器,如果用户在此之后更改设置,则不会再次调用脚本。。。或者,如果在更改设置时有任何方法可以重新加载背景脚本,我也不知道。@wOxxOm谢谢。我将使用“缓存”方法。在发布这个问题之前,我尝试了“交换”的方法。正如我在上面所写的,脚本只被调用一次,因此我无法交换处理程序。你能把你的评论复制到一个答案上吗?这样我就可以选择它作为被接受的答案了?这可能对将来可能遇到相同问题的用户有所帮助。
function toggleListener(enable) {
if (enable) {
chrome.webRequest.onBeforeRequest.addListener(
modifyUrl,
{urls: ['http://somewebsite/*'], types: ['main_frame']},
['blocking']
);
} else {
chrome.webRequest.onBeforeRequest.removeListener(modifyUrl);
}
}
chrome.storage.onChanged.addListener(function(changes, area) {
if (area == "sync" && "someSetting" in changes) {
toggleListener(changes.someSetting.newValue);
}
});
chrome.storage.sync.get("someSetting", function (data) {
toggleListener(data.someSetting);
});