【问题标题】:How to implement "return true;"? Error: "The message port closed before a response was received."如何实现“return true;”?错误:“消息端口在收到响应之前关闭。”
【发布时间】: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

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


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-08-26
    • 2022-09-27
    • 2018-03-26
    • 2019-05-23
    • 2020-11-29
    • 2020-05-11
    • 2021-07-25
    • 2019-08-24
    相关资源
    最近更新 更多