low*_*key 2 javascript google-chrome-extension
我正在尝试使用带弹出页面的浏览器操作访问Chrome中的浏览器历史记录.
var histories = [];
var visits = [];
chrome.history.search({'text':'', 'maxResults':0}, function(historyItems){
for(var h in historyItems){
histories.push({'id': h.id, 'url':h.url});
}
});
for(var h in histories){
chrome.history.getVisits({'url': h.url, function(visitItems){
for(var v in visitItems){
var id = v.id;
var visitId = v.visitId;
var visitTime = v.visitTime;
var referringVisitId = v.referringVisitId;
var transition = v.transition;
visits.push({'id': v.id, 'visitId': v.visitId, 'visitTime': v.visitTime, 'referringVisitId': v.referringVisitId, 'transition':v.transition});
}
});
}
console.log(histories.length + ' histories');
console.log(visits.length + ' visits');
Run Code Online (Sandbox Code Playgroud)
结果我得到234个历史记录和0次访问.我怎么能有一堆没有访问的页面?我究竟做错了什么?
小智 7
您的代码不起作用的原因是对chrome.history的调用的异步性质.
您实际上是在尝试迭代历史[],然后返回chrome.history.search.这意味着那时的历史[]仍然是一个空数组.最终的console.log确实打印出超过0个历史记录吗?无论如何,这是一个竞争条件.
你需要做的是从chrome.history.search中调用回调函数中的chrome.history.getVisits.
这是一种方法:
var histories = [];
var visits = [];
chrome.history.search({text:'', maxResults:0}, function(historyItems) {
var historiesProcessed = 0;
for (var i = 0; i < historyItems.length; i++) {
histories.push(historyItems[i]);
chrome.history.getVisits({url: historyItems[i].url}, function(visitItems) {
for (var i = 0; i < visitItems.length; i++) {
visits.push(visitItems[i]);
}
historiesProcessed++;
if (historiesProcessed === historyItems.length) {
console.log(visits.length + ' visits');
}
});
}
console.log(histories.length + ' histories');
});
Run Code Online (Sandbox Code Playgroud)
这不是最漂亮的代码,但它可以工作,你可以重构它看起来更好.
我不确定你是否可以在弹出页面中访问chrome.history(在测试时让我知道),但它肯定会在后台页面中运行,你可以将结果传递给弹出窗口.