非同期呼び出しの意味 (および内部の仕組み) を誤解している可能性があります。
次のアプローチを提案します。
URL のリストと、未訪問の URL のリストを引数として実行するコールバックを提供します (すべての URL の履歴チェックが完了した後)。
元のリストの各 URL について: アクセスされているかどうかを確認します (アクセスされている場合は、未アクセスの URL のリストに追加します)。
b. checkedURLs
カウンターをインクリメントします。
c. すべての URL が (非同期に) チェックされているかどうかをチェックします。つまりcheckedURLs
、元の URL リストの長さと同じです。
すべての URL がチェックされたことを検出したら ( 2.c.を参照)、指定されたコールバックを実行し ( 1.を参照)、未訪問の URL のリストを引数として渡します。
デモ拡張機能のサンプル コード:
マニフェスト.json:
{
"manifest_version": 2,
"name": "Demo",
"version": "0.0",
"background": {
"persistent": false,
"scripts": ["background.js"]
},
"browser_action": { "default_title": "Demo Extension" },
"permissions": ["history"]
}
background.js:
/* List of URLs to check against */
var urlList = [
"http://stackoverflow.com/",
"http://qwertyuiop.asd/fghjkl",
"https://www.google.com/",
"https://www.qwertyuiop.asd/fghjkl"
];
/* Callback to be executed after all URLs have been checked */
var onCheckCompleted = function(unvisitedURLs) {
console.log("The following URLs have not been visited yet:");
unvisitedURLs.forEach(function(url) {
console.log(" " + url);
});
alert("History check complete !\n"
+ "Check console log for details.");
}
/* Check all URLs in <urls> and call <callback> when done */
var findUnvisited = function(urls, callback) {
var unvisitedURLs = [];
var checkedURLs = 0;
/* Check each URL... */
urls.forEach(function(url) {
chrome.history.getVisits({ "url": url }, function(visitItems) {
/* If it has not been visited, add it to <unvisitedURLs> */
if (!visitItems || (visitItems.length == 0)) {
unvisitedURLs.push(url);
}
/* Increment the counter of checked URLs */
checkedURLs++;
/* If this was the last URL to be checked,
execute <callback>, passing <unvisitedURLs> */
if (checkedURLs == urls.length) {
callback(unvisitedURLs);
}
});
});
}
/* Bind <findUnvisited> to the browser-action */
chrome.browserAction.onClicked.addListener(function() {
findUnvisited(urlList, onCheckCompleted);
});