未捕获(承诺中)错误:侦听器通过返回 true 指示异步响应,但消息通道在响应之前关闭

use*_*067 11 javascript google-chrome-extension promise chrome-native-messaging chrome-extension-manifest-v3

我在 background.js 中发现“未捕获(承诺中)错误:侦听器通过返回 true 指示异步响应,但消息通道在收到响应之前已关闭”错误。我的 chrome 扩展可以工作,但开发工具在 background.js 上显示很多此类错误

我最近将 chrome 扩展从 Manifest V2 迁移到 Manifest V3,从那时起我发现了错误。

这是错误似乎产生的地方:

const browser = chrome || browser;

// Listen for messages from content script
browser.runtime.onMessage.addListener(
    function (request, sender, sendResponse) {
         var frameId = sender.frameId || 0;

            if (request.type == "connect") {               
                connect(sender.tab, frameId);
                sendResponse({ success: true });
            } else if (request.type == "disconnect") {                
                disconnect(sender.tab, frameId);
                sendResponse({ success: true });
            } else if (request.type == "send") {
                sendNativeMessage(request.data, sender.tab);
                document.addEventListener('nativeMessage',
                    function handleNativeMessage(e) {
                        sendResponse(e.detail);
                        document.removeEventListener(e.type, handleNativeMessage);
                    }, false);

               sendResponse({});                
               return true;
            }               
    });
Run Code Online (Sandbox Code Playgroud)

sendresponse 在 ContentScript 中处理:

const browser = chrome || browser;
self.addEventListener("message", function(event){
    var request = event.data;
    if(request != null && request.type == "SendMessage")
    {
        ProcessNativeMessage(request.data);
    }
    
});

function ProcessNativeMessage(nativeMessageData) {
  var request = new Object();
  request.data = nativeMessageData;
  browser.runtime.sendMessage(request,handleExtensionResponse);
}

function handleExtensionResponse(value)
{
    //alert(value);
};
Run Code Online (Sandbox Code Playgroud)

我尝试过返回 true、返回 false、返回未定义、发送空响应,甚至禁用其他扩展,但这些更改都不起作用。

我什至尝试按照此处的建议使用 async/await 更改代码,但这没有什么区别。

Rob*_*bbi -2

如果你像这样重写代码,会有什么变化吗?
无论如何,我无法使用本机消息传递来重现扩展。

const browser = chrome || browser;

var globSendResp, globReqTypeSend;      //(*)

// Listen for messages from content script
browser.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    var frameId = sender.frameId || 0;
    globReqTypeSend = false;            //(*)
    if (request.type == "connect") {               
        connect(sender.tab, frameId);
        sendResponse({ success: true });
    } else if (request.type == "disconnect") {                
        disconnect(sender.tab, frameId);
        sendResponse({ success: true });
    } else if (request.type == "send") {
        globReqTypeSend = true;         //(*)
        globSendResp = sendResponse;    //(*)
        sendNativeMessage(request.data, sender.tab);
        //sendResponse({});             //(*)
        return true;
    }
});

document.addEventListener('nativeMessage', function handleNativeMessage(e) {
    if (globReqTypeSend)
        globSendResp(e.detail)
}, false);
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

27475 次

最近记录:

2 年,2 月 前