我正在编写一个 Chrome 扩展程序。在页面上,我Options保存了一些参数chrome.storage.sync.set:
chrome.storage.sync.set({
x: document.getElementById('a').value,
y: document.getElementById('b').value,
z: document.getElementById('c').value
}, function() {...});
此外,Content script'е我想根据这些参数的值执行我需要的操作。首先,在加载所需的页面时,我获取这些数据并将它们的值分配给一些变量:
var baseA = "";
var baseB = "";
var baseC = "";
chrome.storage.sync.get({
x: "",
y: "",
z: ""
}, function(items) {
setValues(items.x, items.y, items.z);
});
function setValues(v1,v2,v3) {
baseA = v1;
baseB = v2;
baseC = v3;
console.log('baseA | ' + baseA);
console.log('baseB | ' + baseB);
console.log('baseC | ' + baseC);
}
然后我尝试做需要做的事情:
function doSomething() {
if (baseA !="") {
console.log('true ' + baseA);
}
else {console.log('false')}
}
doSomething();
我爬进去Options.html,设置参数:
x = "aaa";
y = "bbb";
z = "ccc";
我爬到脚本应该计算内容的页面,并在控制台中得到以下结果:
false
baseA | aaa
baseB | bbb
baseC | ccc
即,该功能被doSomething()更早地触发。
调用doSomething()viasetTimeout并不有趣,因为内容脚本是在文档加载后执行的,并且需要多长时间是未知的。
据我了解,这完全是由于doSomething()两者chrome.storage.sync.get都是异步执行的。我可以做些什么来确保在需要之前获得参数值?
无法同步使用 chrome.storage。但是,您可以订阅存储更改事件:chrome.storage.onChanges。
还有一件事:确保您使用的是
chrome.storage.sync正确的,其目的是在用户的计算机之间传输扩展设置(通过 Google 服务器)。如果您需要在本地存储扩展设置:最好使用
chrome.storage.local,此外,它的工作速度更快。值得注意的是,Chrome API 文档说如果在浏览器中未启用同步,则同步的工作方式与本地相同: