确保在执行Chrome v3扩展中的其他逻辑之前设置设置

r6vfmomb  于 2023-06-03  发布在  Go
关注(0)|答案(2)|浏览(411)

这是一个v3chrome扩展的background.js示例。我尝试在安装过程中设置扩展的默认设置。

const settings = {
  enableContextMenu: true,
};

chrome.runtime.onInstalled.addListener(details => {
  if (details.reason === 'install') {
    chrome.storage.local.set(settings);
  }
});

chrome.storage.local
  .get(['enableContextMenu'])
  .then(({ enableContextMenu }) => {
    // enableContextMenu is undefined here
    if (enableContextMenu) {
      chrome.contextMenus.create({
        id: 'extension-contextmenu',
        title: 'Extension Menu',
        type: 'normal',
        contexts: ['link'],
      });
    }
  });

但是我如何知道onInstalled中的设置已经设置好,以便我可以通过检查存储中的enableContextMenu来继续添加上下文菜单?在本例中,获取enableContextMenuundefined,尽管设置应该在onInstalled侦听器中设置,可能是因为竞争条件。
初始化设置和根据设置执行其他逻辑的正确算法是什么?

lf3rwulv

lf3rwulv1#

一般来说,这不是一个坏主意,但当您不确定对象是否已初始化时,我仍然建议使用此语法。对于用户触发的事件(我指的是chrome API,如action.on*,omnibox.on*,command.on* 等)通常不需要这种技巧,因为当它们触发时,你可以非常确定参数初始化已经通过。对于诸如“runtime.onMessage”和“runtime.onInstalled”的其他事件不同,这些事件的激活并不总是提前可预见的,因此通常不容易建立代码执行流。当然,在第一次“传递”时,主流程的指令首先被执行,包括同步和异步指令,之后它传递给任何回调函数,最后chrome事件被执行(至少我知道是这样的)。然后可以将初始参数设置为onInstalled,因为您确信它们不会被第二次重新初始化(这可能是有害的),但要注意onInstalled事件处理程序肯定不会首先运行。

t9aqgxwy

t9aqgxwy2#

请试试这个。

const settings = {
  enableContextMenu: true,
};

const main = async () => {
  const result = await chrome.storage.local.get("enableContextMenu");
  console.log(result.enableContextMenu);
  if (!result.enableContextMenu) {
    chrome.storage.local.set(settings);
  }
}

main();

相关问题