我正在编写一个 Chrome 扩展程序供我自己使用。我正在从注入的脚本中查询当前选项卡的索引,如下所示:
[注入脚本]
chrome.runtime.sendMessage({whatIsMyIndex:1}, function(response){
var myIndex = response.index;
});
[背景脚本]
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.whatIsMyIndex){
sendResponse({index: sender.tab.index});
}
}
);
现在这一切都很好,但是我还需要返回第一个选项卡的 url:
[注入脚本2]
chrome.runtime.sendMessage({whatIsMyIndex:1}, function(response){
var myIndex = response.index;
var url = response.url;
});
[背景脚本2]
var url;
//this uses sendResponse when the requested values arrive
function respond(sendResponse, index){
if(typeof(url)!="undefined"){
sendResponse({index:index, url:url});
} else {
setTimeout(respond, 15, sendResponse, index);
}
}
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.whatIsMyIndex){
chrome.tabs.query({index:0, currentWindow:true}, function(tabs){
url=tabs[0].url;
}
setTimeout(respond, 15, sendResponse, sender.tab.index);
return true; //so i can use sendResponse later
}
}
);
现在,这段代码工作得很好。我的问题是,有没有什么方法可以在不需要 setTimeout 的情况下做到这一点?添加固定的 15 毫秒延迟似乎不正确。
如果我能得到 chrome.tabs.query 的回调以将我的 sendResponse() 作为参数...
(将 sendResponse() 存储在全局变量中是不可能的,因为将有大约 20 个选项卡同时执行此操作,并且所有选项卡都需要自己的响应。)
我在这里不需要任何工作(或不工作)的代码,只需要一些想法/指南。