chrome扩展消息passsing:sendResponse不是函数

时间:2018-06-18 08:26:16

标签: javascript google-chrome-extension

在我的Chrome扩展程序中,我尝试在扩展程序chrome-extension://myExtensionId/path/to/web/page.html的内部网页和内容脚本之间交换数据。

因此,为了使这些数据在不同的内容脚本中保持不变,我试图将其作为全局变量保存在扩展程序的后台!我这样做是使用消息传递。

我的问题是:

当我尝试从后台发回回复时,我收到此错误:

  

(未知)事件处理程序出错:TypeError:sendResponse不是   功能

我跟着documentation's examples,这是我的尝试:

scriptOfTheInternalPage.js

var message = {
    'order': 'setData',
    'varName': 'myArray',
    'data': myArray
};
extPort.postMessage(message, function (response) {
    console.log('response:\n', JSON.stringify(response));
});

background.js

var globals = {
    'myArray': [],
    ...
};
chrome.runtime.onConnect.addListener(function (port) {
    port.onMessage.addListener(
            function (message, sender, sendResponse) {
                console.log(
                        'the port received this message:\n', JSON.stringify(message), '\n',
                        (sender.tab) ? ' from tab #' + sender.tab.id : ' from the extension!'
                        );
                if (message.order === 'setData') {
                    globals[message.varName] = message.data;
                    sendResponse({'response': 'data saved!'}); //<=====
                }
                return true; //<=== tried to return true here as well;
            });
});

这个错误是否意味着我应该在onMessage事件监听器之外创建一个全新的功能?

我很困惑!我错过了什么?

1 个答案:

答案 0 :(得分:0)

端口的onMessage事件侦听器与runtime.onMessage的签名不同。您不会获得sendersendResponse个参数,只会获得消息。返回true也没有效果。

要回复邮件,您需要使用端口本身。这是covered by examples

port.onMessage.addListener(function(msg) {
  if (msg.joke == "Knock knock")
    port.postMessage({question: "Who's there?"});
}

所以你确实需要双方都有一个onMessage监听器,并且有一些方法可以跟踪请求(唯一ID?),如果可以的话。