Chome扩展:将chrome.storage数据从后台脚本发送到popup / contentscript

时间:2013-12-19 23:27:39

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

如标题中所述,我正在尝试编写一个后台脚本,该脚本将侦听来自popup.js或contentscript.js的加载请求。当它收到一个加载时,它获取chrome.storage.local的内容,执行一些数据处理(for循环)并将其发送给请求者。

当前的问题,是我的代码收到请求,但无法发回数据。我的代码如下:

popup.js:

chrome.runtime.sendMessage({greeting: "Load"}, function(response) {
  console.log(response);
}

background.js:

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  if(request.greeting=='Load') {
    chrome.storage.local.get(null,function(storeObject){
      var newList=[];
      //Perform some dataprocessing to store part of storeObject into newList
      sendResponse(newList);
    });
  }
});

我认为这个问题与范围有关,因为调试后看起来像sendResponse试图从chrome.storage而不是background.js发送。另外,如果我在chrome.storage.local回调之外(之前/之后)发送消息,popup.js会收到消息。无论如何,我很遗憾该怎么做才能让这条消息通过工作,并希望得到任何帮助。

1 个答案:

答案 0 :(得分:11)

根据 `chrome.runtime.onMessage 上的文档:

  

sendResponse(功能)
  [...] 当事件侦听器返回时,此函数变为无效,除非您从事件侦听器返回true以指示您希望异步发送响应(这将使消息通道保持打开到另一端,直到sendResponse为叫)。

由于sendResponsechrome.storage.local.get()的回调中被异步调用,因此需要从onMessage侦听器返回true以防止该函数失效。

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    if (request.greeting === 'Load') {
        chrome.storage.local.get(null, function(storeObject) {
            ...
            sendResponse(newList);
        });
        return true;   // <-- I intend to call `sendResponse` later
    }
    return false;   // <-- I do NOT intend to call `sendResponse`
});