Chrome存储空间未定义存储计时器

时间:2015-09-20 14:23:22

标签: javascript google-chrome google-chrome-extension

我正在制作Chrome扩展程序,我使用chrome存储来存储变量。实际上我是先从用户输入一个计时器,然后在每T秒后刷新页面,这些是用户输入的。所以这次存储我使用了这样的chrome存储:

.border

任何人都可以帮助为什么currentTimer仍未定义。我正在调试很长时间,但无法找到解决方案。

问题是,只要刷新页面,currentTimer就会获得NULL值,因为用户只输入了一次。

1 个答案:

答案 0 :(得分:1)

当原始函数已经完成时,所有chrome.* API回调都是异步调用的,这也意味着在回调之前执行chrome.* API调用之后的下一个语句。

  1. 将需要结果的代码放入回调中:

    chrome.storage.sync.get('something', function(item) {
           setTimeout(someFunction, item.value);
    });
    
  2. 如果内容脚本中需要结果,请在新消息中返回值:

    • 内容脚本:

      chrome.runtime.sendMessage({request: "doSomething"});
      
      chrome.runtime.onMessage.addListener(function(msg) {
          if (msg.response) {
              // do something with the received msg.response
          }
      });
      
    • 后台脚本:

      chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
          if (msg.request == "doSomething") {
              var tabId = sender.tab.id, frameId = sender.frameId;
              chrome.storage.sync.get('something', function(item) {
                  sendMessageToFrameId(tabId, frameId, {response: item.value});
              });
          }
      });
      
      function sendMessageToFrameId(tabId, frameId, msg) {
          // 1. frameId works since Chrome 41 and throws on prior versions
          // 2. without frameId Chrome 45 sends the message to wrong tabs
          try { chrome.tabs.sendMessage(tabId, msg, {frameId: frameId}); }
          catch(e) { chrome.tabs.sendMessage(tabId, msg); }
      }