不调用chrome.tabs.sendMessage回调函数。为什么?

时间:2014-09-22 00:49:15

标签: javascript google-chrome google-chrome-extension message-passing

我有从Chrome扩展程序的后台脚本调用的以下方法。目标是将消息发送到特定选项卡,然后使用结果调用提供的回调方法。重要的是,callbackDone必须在某个时间点始终。所以它是这样的:

function sendToTab(nTabID, callbackDone)
{
    (function()
    {
        chrome.tabs.sendMessage(nTabID, {
            action: "update01"
        }, 
        function(response) 
        {
            if(chrome.runtime.lastError)
            {
                //Failed to send message to the page
                if(callbackDone)
                    callbackDone(nTabID, null); //Page never received the message
            }
            else
            {
                //Sent message OK
                if(response.result === true)
                {
                    if(callbackDone)
                        callbackDone(nTabID, true); //Success!
                }
                else
                {
                    if(callbackDone)
                        callbackDone(nTabID, false);    //Page returns failure
                }
            }
        });
    }());
}

然后从处理消息的页面(可以是注入content script)中我处理它:

chrome.runtime.onMessage.addListener(onMessageProc);

function onMessageProc(request, sender, sendResponse)
{
    if(request.action == "update01")
    {
        //Do processing .... that sets `bResult`

        sendResponse({result: bResult});
    }
}

上述方法效果很好,除了...说,有一个页面,如选项页面脚本,它不处理我的update01消息,而是处理自己的消息:

chrome.runtime.onMessage.addListener(onMessageProc);

function onMessageProc(request, sender, sendResponse)
{
    if(request.action == "update02")   //Note different action ID
    {
        //Does some other actions...
    }
}

在这种情况下,当我为此选项卡调用第一个sendToTab方法时,永远不会调用callbackDone,即调用chrome.tabs.sendMessage并立即返回,但从不调用其回调函数

那我在这里错过了什么?

1 个答案:

答案 0 :(得分:5)

您看到了预期的行为。

关于回调函数的documentation个状态:

  

如果指定responseCallback参数,它应该是一个如下所示的函数:

     

function(any response) {...};

     

any response
  消息处理程序发送的JSON响应对象。如果在连接到指定选项卡时发生错误,则将调用不带参数的回调,并将runtime.lastError设置为错误消息。

执行sendMessage有3种可能的结果。

  1. 有一个听众,它叫sendResponse 然后,以响应作为参数调用回调。

  2. 有一个监听器,它终止而没有调用sendResponse(同步或异步)。
    然后,根本不会调用回调

  3. 发送邮件时出现了某种错误 然后,调用回调时不带参数并设置chrome.runtime.lastError

  4. 如果您需要在任何情况下执行回叫,您都需要"默认"在您的侦听器中调用sendResponse的情况。