Javascript chrome…addListener,如何等待chrome.storage.sync.get?

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之后使用

我的扩展正在修改一些URL。它工作正常,但现在我想检查是否在设置中启用了修改

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);
});