Javascript 如何实施";返回true&引用;?错误:";消息端口在收到响应之前关闭。”;

Javascript 如何实施";返回true&引用;?错误:";消息端口在收到响应之前关闭。”;,javascript,google-chrome,google-chrome-extension,runtime-error,Javascript,Google Chrome,Google Chrome Extension,Runtime Error,如何实现我的事件处理程序返回true?(尝试了所有操作,但错误返回) 我发现以下错误: “未选中的runtime.lastError:消息端口在 收到了答复。” 解决办法是: “注意:sendResponse回调仅在同步使用时有效, 或者如果事件处理程序返回true以指示它将响应 异步。将调用sendMessage函数的回调 如果没有处理程序返回true或sendResponse 回调已被垃圾回收。“ 编辑:另请参见(chrome): 这是我的代码,我非常感谢: // receive mess

如何实现我的事件处理程序返回true?(尝试了所有操作,但错误返回)

我发现以下错误:

“未选中的runtime.lastError:消息端口在 收到了答复。”

解决办法是:

“注意:sendResponse回调仅在同步使用时有效, 或者如果事件处理程序返回true以指示它将响应 异步。将调用sendMessage函数的回调 如果没有处理程序返回true或sendResponse 回调已被垃圾回收。“

编辑:另请参见(chrome):

这是我的代码,我非常感谢:

// 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;
    }
});

现在似乎已经修好了。我添加了
返回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;
});

返回true可以解决您的问题,因为:

您始终需要sendresponse,您可以向任何值发送响应,但必须发送响应

在您的代码中,除了没有sendresponse之外,还有很多情况

当事件侦听器返回时,此sendresponse函数将无效,除非您从事件侦听器返回true以指示您希望异步发送响应(这将保持消息通道向另一端开放,直到调用sendresponse为止)


ref:

发布的代码不调用异步函数,因此无需在此处添加
return true
。问题一定是别的,不是在发布的代码中,而是在发送消息的代码中。也不清楚为什么您在WebExtension polyfill中链接了这个问题,您在这里没有使用它。谢谢,我正在检查所有其他代码。我认为上面发布的是问题所在,所以(逻辑上)没有任何帮助。请查看Chrome 73Man中是否出现此错误。有同样的问题,无法找出问题所在。“返回真值”修正了它!