假设我的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);
});
在内容脚本中,我opts
通过消息传递进行访问。
chrome.runtime.sendMessage({'message': 'getOpts'}, function(response) {
console.log(opts);
});
是否有任何保证可以在运行内容脚本之前定义选项?例如,启动浏览器时,后台页面将运行,并且chrome.storage.local.get
要添加的回调可能被添加到后台页面的消息队列中。Chrome会在注入内容脚本之前完成对该队列的处理吗?
我可以从内容脚本中调用chrome.storage.local.get,但是我的问题更为笼统,因为我的后台页面中还有其他异步处理功能。目前,我的内容脚本会与后台页面进行检查,以确保一切都准备就绪(使用间隔进行检查),但是我不确定是否需要进行此类检查。
即使在测试中,也不要依赖已定义的变量。通常,由于正常的时间安排,您的var应该在收到消息的时间进行设置,但是请确保在后台onMessage中进行检查。我通过在全局范围内记住是否已经初始化了扩展名并在需要时从onMessage中进行初始化来解决此问题。xan的答案显示了在异步初始化完成后如何在这种情况下使用“返回真”来处理消息。
在我的chrome扩展程序上查看此示例(搜索bCalled
)
在那里,您可以看到我有一个sendResponse方法,该方法负责检测是否已经调用了回调,如果没有,则返回true(假设正在进行异步操作,稍后将调用回调)
您还可以通过伪装加载该var的后台代码中的延迟来进行实验和测试。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句