0

我有一个背景页面和一个内容脚本。内容脚本有这样的代码:从background.js发送消息到内容脚本

chrome.runtime.sendMessage({ getSetting: { setting: "hideAuth" } }, function (hide) { 
    // this should be executed after 'respond(setting)' in the backgroud page 
}); 

背景页有这样的代码:

chrome.runtime.onMessage.addListener(function (msg, sender, respond) { 
    if (msg["getSetting"]) { 
     chrome.storage.sync.get(msg.getSetting.setting, function (setting) { 
      respond(setting); // this should callback to the content script 
      }); 
     }); 
    } 
}); 

但是,永远不会执行的内容脚本的响应回调。我尝试过查询当前标签并手动发送消息,但标签仍然没有收到消息。有没有人处理过这个?是否有另一种方法来做到这一点?

+0

http://stackoverflow.com/a/20077854 – rsanchez

回答

1

既然要异步调用(即chrome.storage.sync.get回调内部respond功能,你应该在你的onMessage侦听器回调添加return true;

chrome.runtime.onMessage.addListener(function (msg, sender, respond) { 
    ... 
    return true; 
}); 

报价the docs

此功能变得当事件监听器返回时无效,除非您从事件监听器返回true以表示您希望异步发送响应(这会记录p消息通道开放到另一端,直到调用sendResponse)。

+0

那么,它的作用就像一个魅力,但现在我得到'不能从'extensions :: event_bindings'代码中调用'null'的方法'disconnect'。有没有办法在代码捕获之前手动断开连接? –

+0

你在哪里断开连接? 'disconnect'仅用于持久连接,不适用于简单的一次性消息传递。你不需要它 - 只需使用上面的代码(不需要更多)。 – gkalpak

+0

就是这样。我不是。它被一些我不能控制的内部代码调用。这意味着我做错了什么。 –

相关问题