Google chrome 通过内容脚本从本地存储访问数据

Google chrome 通过内容脚本从本地存储访问数据,google-chrome,google-chrome-extension,content-script,Google Chrome,Google Chrome Extension,Content Script,我试图从内容脚本访问本地存储,但即使消息传递正常,输出也不符合预期 内容脚本 var varproxy = localStorage.getItem('proxy'); //gets data from options page saved to local storage var proxy = "proxystring"; chrome.runtime.sendMessage({message:"hey"}, function(response) { prox

我试图从内容脚本访问本地存储,但即使消息传递正常,输出也不符合预期

内容脚本

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);
后台页面(用于消息传递)

控制台将代理记录为varproxy的值,并记录“已发送响应”,但

将代理记录为“proxystring”


为什么代理的值没有改变?如何根据需要进行更改?

在众多chrome API函数中,消息发送是一个异步函数。解释器不会等待响应,而是跳到下一行。因此,很容易首先计算日志(代理),因为与后台页面通信需要一些时间。一旦收到响应,代理的值就会更改。

我可以建议您尝试另一种实现吗?Chrome存储呢

然后,您根本不需要任何消息传递,因为您可以在内容脚本中访问chrome存储

例如,我在extensions的内容脚本中这样做是为了从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 */

就我个人而言,我发现这种方法比消息传递实现简单得多。

如果我使用setTimeout(function(){console.log(proxy)},2000);我会得到预期的输出吗?我本想建议您进行测试,但最后我删除了它。:)是的,试试看!我确实试过了,但仍然得到了相同的结果。contentscript中的响应回调函数被调用了吗?使用唯一日志记录对其进行测试。你没有在背景页中得到一个错误吗?我运行了您的代码,但出现了一个错误,因为您没有在后台页面中定义varproxy。注意:contentscript和background有两个不同的控制台,您可以进行不同的检查。好的,我再试了一次,使用setTimeout()我没有得到相同的结果,我得到了null,这与从响应函数内部记录时作为response.proxy记录的值相同
console.log(proxy);
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 */