我有从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
并立即返回,但从不调用其回调函数
那我在这里错过了什么?
答案 0 :(得分:5)
您看到了预期的行为。
关于回调函数的documentation个状态:
如果指定responseCallback参数,它应该是一个如下所示的函数:
function(any response) {...};
any response
消息处理程序发送的JSON响应对象。如果在连接到指定选项卡时发生错误,则将调用不带参数的回调,并将runtime.lastError
设置为错误消息。
执行sendMessage
有3种可能的结果。
有一个听众,它叫sendResponse
然后,以响应作为参数调用回调。
有一个监听器,它终止而没有调用sendResponse
(同步或异步)。
然后,根本不会调用回调。
发送邮件时出现了某种错误
然后,调用回调时不带参数并设置chrome.runtime.lastError
。
如果您需要在任何情况下执行回叫,您都需要"默认"在您的侦听器中调用sendResponse
的情况。