Chrome扩展程序:处理异步sendMessage。

Ste*_*ico 2 asynchronous sendmessage google-chrome-extension

我正在研究提取元数据的chrome扩展程序。解析元数据的代码包含在内容脚本中。background.js和content.js通过sendMessage请求和响应进行通信。我遇到了sendMessage请求具有异步性质的问题,并且不确定如何解决(即使在阅读了有关该问题的讨论之后也是如此)。任何建议或指示,将不胜感激。我怀疑我没有得到如何将它们转换为回调。

background.js:

function onContextClick(info, tab) {    
  if( info["selectionText"] ){  
    var x = getMeta(tab);   
    //do stuff with x       
  }
}

function getMeta (tab) {
chrome.tabs.sendMessage(tab.id, {fetchTag: "meta,name,author,content"}, function(response) {
    //alert(response.data);
    //one thing I tired was to put my "do stuff" embedded here, but that didn't work either         
    return response.data; 
    });
}

var menu_id = chrome.contextMenus.create({"title": "Get Meta", "contexts":["selection"], "onclick": onContextClick});
Run Code Online (Sandbox Code Playgroud)

content.js:

function fetchTag(string) {
    var param = string.split(",");
    return $(param[0] + "["+param[1]+ "=\"" + param[2] + "\"]").attr(param[3]); 
    }

chrome.extension.onMessage.addListener(
  function(request, sender, sendResponse) {
    if (request.fetchTag.length > 0)        
    sendResponse({data: fetchTag(request.fetchTag)});
  });
Run Code Online (Sandbox Code Playgroud)

小智 5

来自:https : //developer.chrome.com/extensions/runtime#event-onMessage

响应时调用(最多一次)的函数。参数应为任何JSON可指定对象。如果在同一文档中有多个onMessage侦听器,则只能发送一个响应。当事件侦听器返回时,此函数将变为无效,除非您从事件侦听器返回true表示您希望异步发送响应(这将使消息通道向另一端开放,直到调用sendResponse为止)。

chrome.extension.onMessage.addListener(
  function(request, sender, sendResponse) {
    if (request.fetchTag.length > 0)        
    sendResponse({data: fetchTag(request.fetchTag)});
    return true;
});
Run Code Online (Sandbox Code Playgroud)

然后它将与异步代码一起使用。


fis*_*ick 5

就我而言,

  1. 简单地按照文档的建议添加return true并没有帮助
  2. listener将in设置onMessageasync并使用await来等待异步响应并使用发送它sendResponse没有帮助

我所说的“无济于事”是指 Chrome 控制台中发生以下错误:

Unchecked runtime.lastError: The message port closed before a response was received.
Run Code Online (Sandbox Code Playgroud)

经过一些实验,我发现以下方法可以很好地异步发送响应。

Unchecked runtime.lastError: The message port closed before a response was received.
Run Code Online (Sandbox Code Playgroud)
// content.js
chrome.runtime.sendMessage({ type: "GET_FOO" }, function (response) {
  console.log(response.foo);
});
Run Code Online (Sandbox Code Playgroud)

在 Chrome 92.0.4515.159(官方版本)(x86_64) 上测试。