如何实现“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)

如何使用 axios 显示响应错误消息

如何在 Spring MVC 中管理错误消息

如何自定义 GraphQL 查询验证错误消息