如何实现“return true;”?错误:“消息端口在收到响应之前关闭。”
Posted
技术标签:
【中文标题】如何实现“return true;”?错误:“消息端口在收到响应之前关闭。”【英文标题】:How to implement "return true;"? Error: "The message port closed before a response was received." 【发布时间】:2019-07-11 04:55:35 【问题描述】:如何实现我的事件处理程序返回 true? (尝试了所有方法,但错误返回)
我收到以下错误:
"未检查的 runtime.lastError: 消息端口在 a 之前关闭 已收到回复。”
解决办法是:
"注意:sendResponse 回调仅在同步使用时有效, 或者如果事件处理程序返回 true 表示它将响应 异步。将调用 sendMessage 函数的回调 如果没有处理程序返回 true 或者如果 sendResponse 回调被垃圾回收。”
https://developer.chrome.com/extensions/messaging#simple
编辑:另见(chrome):https://github.com/mozilla/webextension-polyfill/issues/130
这是我的代码,非常感谢:
// receive message from pop-up or options
chrome.extension.onMessage.addListener(function (aRequest, aSender,
aSendResponse)
if (!aSender)
return;
switch (aRequest.cmd)
// reload lists
case 'reload':
XX.blockedDomains = ;
XX.load();
break;
// send list of recently blocked
case 'blocked':
aSendResponse(Object.keys(XX.blockedDomains));
break;
// deny domain
case 'deny':
XX.blocklist[aRequest.domain] = 1;
delete XX.blockedDomains[aRequest.domain];
XX.save();
break;
);
【问题讨论】:
贴出的代码没有调用异步函数,所以这里不需要添加return true
。问题肯定出在其他问题上,而不是在发布的代码中,而是在发送消息的代码中。也不清楚为什么你在 WebExtension polyfill 中链接了这个问题,你在这里没有使用它。
谢谢,我正在检查所有其他代码。认为上面发布的问题是问题,所以(逻辑上)没有任何帮助。
如果 Chrome 73 中出现此错误,请查看 support.google.com/chrome/thread/2047906?msgid=2556826
【参考方案1】:
现在似乎已修复。我在倒数第二行添加了return true;
,现在日志中没有更多错误条目了。
这个解决方案好吗?如果有问题,我们会很高兴收到反馈。否则,我会在几天后将此线程标记为已解决。
// receive message from pop-up or options
chrome.extension.onMessage.addListener(function (aRequest, aSender,
aSendResponse)
if (!aSender)
return;
switch (aRequest.cmd)
// reload lists
case 'reload':
XX.blockedDomains = ;
XX.load();
break;
// send list of recently blocked
case 'blocked':
aSendResponse(Object.keys(XX.blockedDomains));
break;
// deny domain
case 'deny':
XX.blocklist[aRequest.domain] = 1;
delete XX.blockedDomains[aRequest.domain];
XX.save();
break;
return true;
);
【讨论】:
谢谢伙计。有同样的问题,无法弄清楚出了什么问题。 “返回真;”修好了!【参考方案2】:return true 可以解决你的问题,因为:
你总是需要sendresponse,你可以sendresponse到任何值,但是你必须sendresponse。
在你的代码中,有很多情况,比没有发送响应。
当事件侦听器返回时,此 sendresponse 函数将变为无效,除非您从事件侦听器返回 true 以指示您希望异步发送响应(这将保持消息通道对另一端开放,直到调用 sendResponse)。
参考:https://developer.chrome.com/extensions/runtime#event-onMessage
【讨论】:
以上是关于如何实现“return true;”?错误:“消息端口在收到响应之前关闭。”的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Keras、RepeatVector 或 return_sequence=True 中连接 LSTM 层?
如何使用 Python 的 ast 创建类型化的返回? - `def f() -> bool: return True`
js跳出循环的方法区别( break, continue, return ) 及 $.each 的(return true 和 return false)