在Chrome扩展程序中使用嵌套异步调用传递的消息失败

时间:2019-03-08 04:03:09

标签: google-chrome-extension message-passing

这有效:在 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.

1 个答案:

答案 0 :(得分:0)

我刚刚发布了可帮助解决这种情况的OSS库:@wranggle/rpc

看看BrowserExtensionTransport。它包含一个在内容脚本和后台窗口之间进行远程调用的示例。