Google chrome 不能使用“;Chrome.storage.sync.set“;更新键:值对的步骤

Google chrome 不能使用“;Chrome.storage.sync.set“;更新键:值对的步骤,google-chrome,google-chrome-extension,Google Chrome,Google Chrome Extension,背景: var obj = {}; obj['website_name'] = 'test1'; chrome.storage.sync.set(obj, function(){ chrome.storage.sync.get('website_name', function(data){ console.log('1st website_name: ', data); }); }); obj['website_name'] = 'test2'; chrome.storage.s

背景:

var obj = {};
obj['website_name'] = 'test1';
chrome.storage.sync.set(obj, function(){
  chrome.storage.sync.get('website_name', function(data){
    console.log('1st website_name: ', data);
  });
});
obj['website_name'] = 'test2';
chrome.storage.sync.set(obj, function(){
  chrome.storage.sync.get('website_name', function(data){
    console.log('2nd website_name: ', data);
  });
});
嗨,我在我的chrome扩展中使用chrome.storage。情况是,我可能会启动一个key:value对,然后我可能需要修改现有key的值

因此我编写了以下代码来测试是否可以修改现有密钥:

var obj = {};
obj['website_name'] = 'test1';
chrome.storage.sync.set(obj, function(){
  chrome.storage.sync.get('website_name', function(data){
    console.log('1st website_name: ', data);
  });
});
obj['website_name'] = 'test2';
chrome.storage.sync.set(obj, function(){
  chrome.storage.sync.get('website_name', function(data){
    console.log('2nd website_name: ', data);
  });
});
以下是console.log显示的内容:

var obj = {};
obj['website_name'] = 'test1';
chrome.storage.sync.set(obj, function(){
  chrome.storage.sync.get('website_name', function(data){
    console.log('1st website_name: ', data);
  });
});
obj['website_name'] = 'test2';
chrome.storage.sync.set(obj, function(){
  chrome.storage.sync.get('website_name', function(data){
    console.log('2nd website_name: ', data);
  });
});
这两行都显示了key:value对是website\u name:test2,奇怪


有人能告诉我代码是否有问题吗?

从您发布的内容可以清楚地看出,密钥的值正在被修改。最初,您将其设置为等于
“测试1”
,然后将其重写为等于
“测试2”

您可以通过分别执行代码的两个块来双重检查这一点

你的第一段代码

obj['website_name'] = 'test1';
chrome.storage.sync.set(obj, function(){
  chrome.storage.sync.get('website_name', function(data){
    console.log('1st website_name: ', data);
  });
});
obj['website_name'] = 'test2';
chrome.storage.sync.set(obj, function(){
  chrome.storage.sync.get('website_name', function(data){
    console.log('2nd website_name: ', data);
  });
});
将“测试1”记录到控制台

还有你的第二段代码

obj['website_name'] = 'test1';
chrome.storage.sync.set(obj, function(){
  chrome.storage.sync.get('website_name', function(data){
    console.log('1st website_name: ', data);
  });
});
obj['website_name'] = 'test2';
chrome.storage.sync.set(obj, function(){
  chrome.storage.sync.get('website_name', function(data){
    console.log('2nd website_name: ', data);
  });
});
将“测试2”记录到控制台

那么,为什么当您一次性执行所有代码时,“测试2”会被打印两次呢

这是因为chrome扩展的本地存储API是异步的。基本上,第二个代码块在第一个代码块能够检索到
website\u name
的值之前,会覆盖该值。因此,当第一个代码块获得密钥时,它已经被覆盖并设置为等于
“test 2”
,因此“test 2”被记录到控制台两次

您可以通过将第二个代码块包装在
setTimeout
中来检查这是否正确

var obj = {};
obj['website_name'] = 'test1';
chrome.storage.sync.set(obj, function(){
  chrome.storage.sync.get('website_name', function(data){
    console.log('1st website_name: ', data);
  });
});

setTimeout(function() {
  obj['website_name'] = 'test2';
  chrome.storage.sync.set(obj, function(){
    chrome.storage.sync.get('website_name', function(data){
      console.log('2nd website_name: ', data);
    });
  });
}, 500);
这会将第二个代码块的执行延迟半秒——这足以说明我上面描述的内容

您的控制台现在将显示“测试1”,然后显示“测试2”


实际上,您不会在
setTimeout
中包装第二个代码块。通常不太可能需要存储一个值,然后立即检索它,然后立即重置它。如果在存储第一个密钥和覆盖它之间有半秒钟的时间,那么您的代码将非常有效。

非常感谢!我设置了超时,一切正常!