如何实现我的事件处理程序返回 true ? (尝试了所有操作,但错误返回)
我遇到以下错误:
“未选中的runtime.lastError:消息端口在 收到答复。”
解决方案是:
”注意: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;
}
});
答案 0 :(得分:0)
现在似乎已修复。我在倒数第二行上添加了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;
});
答案 1 :(得分:0)
返回true可以解决您的问题,原因仅在于:
您始终需要发送响应,您可以将响应发送到任何值,但是必须发送响应。
在您的代码中,有很多情况,而没有sendresponse。
事件侦听器返回时,此sendresponse函数将变为无效,除非您从事件侦听器返回true表示您希望异步发送响应(这将使消息通道向另一端开放,直到调用sendResponse为止)。 / p>
ref:https://developer.chrome.com/extensions/runtime#event-onMessage