我正在尝试从内容脚本访问本地存储,但即使消息传递正常,输出也不是预期的。
内容脚本
var varproxy = localStorage.getItem('proxy'); //gets data from options page saved to local storage
var proxy = "proxystring";
chrome.runtime.sendMessage({message:"hey"},
function(response) {
proxy = response.proxy;
console.log(response.proxy);
}
);
console.log(proxy);
背景页(用于传递消息)
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse)
{
if (request.message == "hey")
{
sendResponse({proxy: varproxy});
console.log('response sent');
}
else
{sendResponse({});}
});
控制台将代理记录为varproxy的值,并将“响应已发送”记录为
console.log(proxy);
将代理记录为“proxystring”
为什么代理的价值不会改变?如何根据需要进行更改?
答案 0 :(得分:1)
消息发送 - 在许多chrome API函数中 - 是一个异步函数。翻译不会等待响应,但会跳到下一行。因此,很容易发生首先评估日志(代理),因为与后台页面通信需要一些时间。收到响应后,代理的值就会更改。
答案 1 :(得分:1)
我可能会建议您尝试其他实现吗? Chrome存储怎么样?
然后您根本不需要传递任何消息,因为您可以在内容脚本中访问chrome存储。
示例,我在扩展程序的内容脚本中执行此操作,以从chrome存储中获取多个值:
chrome.storage.sync.get({HFF_toolbar: 'yes',HFF_logging: 'yes',HFF_timer: '1 Minute'},
function (obj) {
toolbar_option = obj.HFF_toolbar;
logging_option = obj.HFF_logging;
timer_option = obj.HFF_timer;
/* the rest of my content script, using those options */
无论如何,我个人认为这种方法比消息传递实现更容易。