Asynchronous Chrome扩展:处理异步sendMessage。

Asynchronous Chrome扩展:处理异步sendMessage。,asynchronous,google-chrome-extension,sendmessage,Asynchronous,Google Chrome Extension,Sendmessage,我正在开发一个提取元数据的chrome扩展。解析元数据的代码包含在内容脚本中。background.js和content.js通过sendMessage请求和响应进行通信。我遇到了sendMessage请求的异步性质的问题,我不知道如何解决它(即使在阅读了关于该问题的一系列讨论之后)。如有任何建议或指示,将不胜感激。我想我不知道如何把这些变成回调 background.js: function onContextClick(info, tab) { if( info["selecti

我正在开发一个提取元数据的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});
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)});
  });
您可以使用闭包。就这样

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

function getMeta (tab, callback) {
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
    callback(response.data);
    });
}
发件人:

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


然后它将与异步代码一起工作。

这帮了我很大的忙——让我走上了正确的轨道,现在它对我来说很有用。非常感谢-只是我在一些方面遇到了麻烦-这一点应该是显而易见的!感谢您的帮助。
Callbacks
是正确的术语,而不是
closures
。这个问题被问了很多次,也被回答了很多次,所以只需指向一个重复的问题,最好是像我一直指向的那个包含解释的问题
chrome.extension.onMessage.addListener(
  function(request, sender, sendResponse) {
    if (request.fetchTag.length > 0)        
    sendResponse({data: fetchTag(request.fetchTag)});
    return true;
});