代码之家  ›  专栏  ›  技术社区  ›  Ralfeus

边缘扩展:运行时。sendMessage未收到响应

  •  0
  • Ralfeus  · 技术社区  · 7 年前

    我正在写一个边缘扩展,努力在内容脚本和背景脚本之间进行通信。 我正在将一条消息从内容脚本发送到后台脚本:

    browser.runtime.sendMessage({ name: "get_card_for_website", url: document.URL }, function(response) {
        console.log("Got card for the website:");
        console.log(response);
        if (response != undefined) {
            if (response.card) {
                g_card = response.card;
                callback(response.card);
            }
        }
    });
    

    后台脚本中的侦听器实现如下:

    browser.runtime.onMessage.addListener(function (request, sender, sendResponse) {
        if (request.name == 'get_card_for_website') {
            get_card_for_website(request.url)
                .done(function(element) {
                    if (element.cards && element.cards.length != 0) {
                        if (element.cards.length == 1) {
                            sendResponse({'card': element.cards[0]});
                        }
                        else {
                            get_one_card_for_site(element);
                            sendResponse({'card': ""});
                        }
                    }
                 });
        }
    }
    

    调试器显示消息被发送到后台脚本,并在sendResponse之前执行相应的代码。但在内容脚本中,永远不会执行此回调函数。控制台未显示任何错误。 我会错过什么?

    更新:我发现有些选项卡收到响应,有些没有。我真的不明白第一个和第二个选项卡之间的区别。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Ralfeus    7 年前

    好的,我找到了问题的原因。已在中调用sendResponse()。函数,该函数被异步调用。根据手册:

    这个 发送响应 回调仅在同步使用时有效,或者 事件处理程序返回 真的 表示它将响应 异步。

    因此,我修改了背景脚本的函数:

    if (request.name == 'get_card_for_website') {
        get_card_for_website(request.url)
            .done(function(element) {
                if (element.cards && element.cards.length != 0) {
                    if (element.cards.length == 1) {
                        sendResponse({'card': element.cards[0]});
                    }
                    else {
                        get_one_card_for_site(element);
                        sendResponse({'card': ""});
                    }
                }
             });
        return true; // <----- this part I've added
    }
    

    现在它像一个魔咒一样工作。