【问题标题】:Chrome extension error "Unchecked runtime.lastError: The message port closed before a response was received"Chrome 扩展错误“未检查的 runtime.lastError:消息端口在收到响应之前关闭”
【发布时间】:2020-05-11 19:31:11
【问题描述】:

我试图简单地从 popup.js 调用 background.js 中的一个函数。但是,我得到“未检查的 runtime.lastError:消息端口在收到响应之前关闭。”错误。

我最初的“握手”消息运行良好,没有错误,但我的“AnotherMessage”收到上述错误。

我正在尝试遵循here 找到的 onMessage 和 sendMessage 文档,但我可能做错了什么。

popup.js

//works perfectly fine
chrome.runtime.sendMessage({msg:"Handshake"}, response => {
    if(response.error){
        console.log(response);
    }
});

//Gives error message
chrome.runtime.sendMessage({msg:"AnotherMessage"}, response => {
    if(response.error){
        console.log(response);
    }
});

我想要两个 'sendMessage' 的原因是因为我想根据某些逻辑在 background.js 中执行特定的功能。

background.js

chrome.runtime.onMessage.addListener((request,sender,sendResponse){
if(request.msg === "Handshake"){
    //Do something
} else if (request.msg === "AnotherMessage") {
    //Do something else
   }
});

更新:为了添加一些上下文,我的扩展中基本上有两种形式。我想将表单提交的数据发送到我的数据库,所以“form-1”提交执行“function-1”和“form-2 em>' 提交应该在 background.js 中执行 'function-2'。我正在尝试通过 sendMessage 和 onMessage 实现不同的功能执行。

【问题讨论】:

  • 在后台脚本中,如果异步调用sendResponse,则必须从回调函数中返回true
  • 尝试将第二个 sendMessage 放在第一个的回调中。
  • 请把我当白痴对待。我不确定您的意思,您介意详细说明吗?

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


【解决方案1】:

在后台脚本中,如果异步调用sendResponse,则必须从回调函数中返回true

 chrome.runtime.onMessage.addListener((request,sender,sendResponse){
    if (request.msg === "Handshake"){
        //Do something
    } else if (request.msg === "AnotherMessage") {
        //Do something else
   }
   return true;   
});

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
猜你喜欢
  • 2021-02-15
  • 2019-05-23
  • 2019-06-05
  • 2021-07-25
  • 2021-11-17
  • 2020-11-29
  • 2019-08-09
  • 2021-05-13
相关资源
最近更新 更多