如何实现“归真”?错误:“消息端口在收到响应之前已关闭。”

时间:2019-02-17 18:56:30

标签: javascript google-chrome google-chrome-extension runtime-error

如何实现我的事件处理程序返回 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;
    }
});

2 个答案:

答案 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