chrome扩展 - 获取未检查的runtime.lastError: 在接收到响应之前消息端口已关闭
chrome扩展 - 获取未检查的runtime.lastError: 在接收到响应之前消息端口已关闭
非常抱歉,由于我刚接触Chrome扩展程序,所以可能会有一些明显的错误。关于Chrome的消息传递API的错误,已经在之前的这里,这里和这里进行了讨论,普遍的回应是“禁用现有的Chrome扩展程序,其中一个扩展程序导致了错误”。这是最好的解决办法吗?我们只能妥协并接受我们的扩展程序会与其他扩展程序冲突的事实吗?对于监听器回调函数,返回true或返回一个Promise并使用sendResponse
并不能解决我的问题。目前,我只能通过禁用所有其他Chrome扩展程序,删除扩展程序并重新加载未打包的扩展程序来获取存储在chrome.storage.local
中的新值(没有错误)。有趣的是,这段代码似乎只在developer.chrome.com上起作用,在manifest.json
的其他“匹配”URL上根本不起作用。我认为在解决这个问题时,await
和async
操作符有一定的重要性,但我不确定如何正确地实现它。非常感谢您抽出时间来审查/重新审查这个问题,我不希望得到与前面提到的“禁用现有扩展程序”相关的解决方案。
Chrome扩展程序 - 获取Unchecked runtime.lastError: The message port closed before a response was received错误的原因可能是在使用sendMessage时没有正确处理返回响应的情况。以下是解决该问题的方法:
1. 如果需要从异步运行的代码(如chrome API回调)中获取响应:
- 保持`return true`不变
- 在回调函数内部调用`sendResponse(someImportantData)`来发送响应
例如:
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { chrome.storage.local.set({foo: 'bar'}, () => { sendResponse('whatever'); }); return true; });
2. 如果需要立即发送响应:
- 将`return true`替换为`sendResponse`
例如:
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { sendResponse('whatever'); });
3. 如果不需要任何响应:
- 在sendMessage中移除回调函数
例如:
chrome.tabs.sendMessage(tabs[0].id, {request: "Requesting headline"});
- 移除`return true`,因为它只是告诉API无限期保持消息传递端口打开,但你永远不会使用它,所以它只是一个内存泄漏的来源
例如:
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { // do something // 不要返回true // ManifestV2:不要调用sendResponse // ManifestV3 bug:取消下一行的注释 // sendResponse(); });
对于Chrome 99、100、101的ManifestV3,你需要一个虚拟的sendResponse()调用。
以上是关于解决Chrome扩展程序中出现Unchecked runtime.lastError: The message port closed before a response was received错误的方法。