我正在开发一个提取元数据的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)});
});
答案 0 :(得分:2)
发件人: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;
});
然后它将与异步代码一起使用。
答案 1 :(得分: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);
});
}