2012-12-30 39 views
1

我正在研究提取元数据的chrome扩展。解析元数据的代码包含在内容脚本中。 background.js和content.js通过sendMessage请求和响应进行通信。我遇到了一个与sendMessage请求的异步性质有关的问题,我不知道如何解决它(甚至在阅读了关于该问题的讨论之后)。任何意见或方向将不胜感激。我怀疑我没有得到如何将这些转化为回调。Chrome扩展:处理异步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)}); 
    }); 
+0

的可能的复制[如何返回从异步调用的响应?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-电话) – wOxxOm

回答

0

您可以使用关闭。通过这种方式。

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); 
    }); 
} 
+0

这帮助了一大堆 - 让我开始了正确的轨道,现在它为我工作。非常感谢 - 一直困扰着我的一些问题 - 这应该是显而易见的!感谢帮助。 –

+0

“回调”是正确的术语,而不是“关闭”。此外,这个问题被问及并回答了很多次,所以只需指向一个重复的问题,最好是包含像[那个答案]一样的解释的问题(http://stackoverflow.com/questions/14220321/how-to-return-the -response-from-an-asynchronous-call)我总是指向。 – wOxxOm