这有效:在 onMessage 侦听器中传递简单消息,而无需嵌套调用chrome API。
content_script
chrome.runtime.sendMessage({ message: "what is my windowId?" }, function(response) {
// clearLocalStorage(response.allWindowsId);
windowId = response.windowId;
console.log(windowId);
});
background_script
chrome.runtime.onMessage.addListener(function(request, sender,sendResponse) {
if (request.message === "buttonClick") {
chrome.tabs.reload(sender.tab.id);
sendResponse({message: 'handle button click'});
} else if (request.message === "what is my windowId?") {
sendResponse({
windowId: sender.tab.windowId
});
}
return;
});
这不起作用:在onMessage侦听器中嵌套调用chrome.windows.getAll。
background_script
chrome.runtime.onMessage.addListener(function(request, sender,sendResponse) {
if (request.message === "buttonClick") {
chrome.tabs.reload(sender.tab.id);
sendResponse({message: 'handle button click'});
} else if (request.message === "what is my windowId?") {
// additional code here
chrome.windows.getAll(function(windows) {
sendResponse({
windowId: sender.tab.windowId,
windows: windows
});
});
}
return;
});
我还尝试使用chrome.windows.getAll使通话chromeExtensionAsync异步,但是还没有运气。
以下是错误消息。似乎对window.getAll的调用发生在函数 onMessage 返回之后,即使我在最后的 return; 语句中将该函数标记为异步。
Error handling response: TypeError: Cannot read property 'windowId' of undefined
Unchecked runtime.lastError: The message port closed before a response was received.
答案 0 :(得分:0)
我刚刚发布了可帮助解决这种情况的OSS库:@wranggle/rpc
看看BrowserExtensionTransport。它包含一个在内容脚本和后台窗口之间进行远程调用的示例。