Chrome扩展程序背景页面和内容脚本同步

Dan*_* S. 5 javascript google-chrome-extension

假设我在Chrome扩展程序的后台页面中有以下代码.

var opts;
chrome.storage.local.get(options, function(result) {
    opts = result[options];
});

chrome.runtime.onMessage.addListener(function(request, sender, response) {
    if (request.message === 'getOpts')
        response(opts);
});
Run Code Online (Sandbox Code Playgroud)

在我的内容脚本中,我opts通过消息传递进行访问.

chrome.runtime.sendMessage({'message': 'getOpts'}, function(response) {
    console.log(opts);
});
Run Code Online (Sandbox Code Playgroud)

是否有保证在内容脚本运行之前定义opts?例如,在启动浏览器时,后台页面将会运行,并且可能chrome.storage.local.get会将回调添加到后台页面的消息队列中.Chrome会在注入内容脚本之前完成对该队列的处理吗?

我可以从内容脚本中调用chrome.storage.local.get,但我的问题更通用,因为我在后台页面中有额外的异步处理.目前,我的内容脚本检查后台页面以确保一切准备就绪(使用间隔继续检查),但我不确定是否需要进行此类检查.

Zig*_*del 0

即使变量存在于测试中,也不要依赖已定义的变量。一般来说,由于正常的计时,您的 var 应该在收到消息时设置,但为了确保您应该在后台 onMessage 中进行检查。我通过在全局中记住是否已经初始化了扩展来处理这个问题,并在需要时从 onMessage 执行此操作。xan 的答案显示了在这种情况下如何使用“return true”在异步初始化完成后处理消息。

在我的 chrome 扩展上查看此示例(搜索bCalled

在那里你可以看到我有一个 sendResponse 方法,它负责检测回调是否已经被调用,如果没有,则返回 true (假设异步操作正在进行中,稍后将调用回调)

您还可以通过在加载该变量的后台代码中伪造延迟来进行实验和测试。