这是一个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来继续添加上下文菜单?在本例中,获取enableContextMenu是undefined,尽管设置应该在onInstalled侦听器中设置,可能是因为竞争条件。
初始化设置和根据设置执行其他逻辑的正确算法是什么?
2条答案
按热度按时间lf3rwulv1#
一般来说,这不是一个坏主意,但当您不确定对象是否已初始化时,我仍然建议使用此语法。对于用户触发的事件(我指的是chrome API,如action.on*,omnibox.on*,command.on* 等)通常不需要这种技巧,因为当它们触发时,你可以非常确定参数初始化已经通过。对于诸如“runtime.onMessage”和“runtime.onInstalled”的其他事件不同,这些事件的激活并不总是提前可预见的,因此通常不容易建立代码执行流。当然,在第一次“传递”时,主流程的指令首先被执行,包括同步和异步指令,之后它传递给任何回调函数,最后chrome事件被执行(至少我知道是这样的)。然后可以将初始参数设置为onInstalled,因为您确信它们不会被第二次重新初始化(这可能是有害的),但要注意onInstalled事件处理程序肯定不会首先运行。
t9aqgxwy2#
请试试这个。