npm “侦听器通过返回true指示异步响应,但消息通道在接收到响应之前关闭”,这是什么意思?

rqqzpn5f  于 2022-11-14  发布在  其他
关注(0)|答案(5)|浏览(2733)

我正在开发一个React应用程序,我使用了一些npm模块,其中一个模块是我自己构建的。(我的NPM包:https://www.npmjs.com/package/modale-react-rm)的数据。
它是一个简单的模式,使用useState()打开和关闭。
导入我的软件包后,我的控制台中出现了一个错误,几秒钟后突然出现,没有执行任何操作。

Uncaught (in promise)                                                                  localhost/:1

    >{message: 'A listener indicated an asynchronous response by r…age channel closed before a response was received'}
         message: "A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received"
        >[[Prototype]]: Object
             >constructor: ƒ ()
             >[[Prototype]]: Object

       /* sometimes there are specific elements in addition but I could not check when they appear and when not */

            Promise.then (asynchrone)       
            (anonyme)              @content_script_bundle.js:108
            handleNewFeatures      @content_script_bundle.js:101
            handleUpdatedNodes     @content_script_bundle.js:101
            (anonyme)              @content_script_bundle.js:101
            childlist(asynchrone)
            0                      @purplebox.js:1
            (anonyme)              @purplebox.js:1
            v                      @purplebox.js:1

它不会阻止我的网页,也不会阻止其功能的正常运行,但它是一个错误,我认为它应该得到修复,也许可以帮助其他人谁有同样的问题。

  • 我指定我在这个项目中不做任何异步请求。所有的东西都是本地的,我使用的少数数据都是直接以原始格式导入的。我也不知道Purplebox.js是从哪里来的。*
vuktfyat

vuktfyat1#

这个问题是一个跨源请求问题,它是由各种Chrome扩展引起的。我在我的Angular应用程序中也有这个问题,在隐姓埋名模式下测试后,错误不再出现。
更多信息:Google Forum
/Edit:如果您是扩充功能开发人员,请浏览这里:从跨来源提取数据时需要return true。更多信息:Chromium Project

eimct9ow

eimct9ow2#

在我的例子中,它是由Ghostery extension引起的,如果这个错误出现在您的本地主机上,您需要将其添加到Ghostery的受信任站点列表中,错误就会消失。

7d7tgy0s

7d7tgy0s3#

它一直是discussed in the webextension-polyfill library,这是由许多扩展(包括Ghostery)使用。有一个最近的变化,在Chrome中引入了错误信息。
对于使用polyfill的项目,我希望如果合并修复程序,警告就会消失。注意,这里使用了polyfill库,因为只有Firefox实现了新的基于承诺的runtime.onMessage,而Chrome仍然执行原始的回调风格的API。
请注意,webextension-polyfill库中已经有一个open pull request。它还没有被合并,但是根据我的测试,它解决了这个问题。所以,如果你需要一个内部使用这个库的项目的快速修复,你可以手动应用patch-package的补丁。例如,this is how such a change would look like in Ghostery

ca1c2owp

ca1c2owp4#

后台脚本(MV 3中的服务工作人员)可能会进入非活动状态,而不会向其从内容脚本接收到的消息发送回响应。
示例:

背景脚本:

chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  // ... handle message
  return true // Error message says you already return true
})

大多数MV 3 API都是异步的,并且可以在有意义的时候返回承诺。(在某些情况下,像事件侦听器(例如:onRemoved),那么返回一个承诺就没有意义了)。然而,可以使用回调或承诺样式来阅读响应。

内容脚本:读取响应方法1:

chrome.runtime.sendMessage('ping', (response) => { /* read response */ })

内容脚本:读取响应方法2:

chrome.runtime.sendMessage('ping').then(response => { /* read response */ })

您面临的问题是:后台脚本不会为它收到的一条/多条处于非活动状态的消息调用sendResponse()(导致消息通道关闭)。但是,发送消息的内容脚本正在等待响应。
请检查您的邮件发件人和处理程序。

bejyjqdl

bejyjqdl5#

我也遇到了同样的错误。我删除了Tampermonkey扩展并调整了我的AdBlock扩展,然后它对我起作用了。

相关问题