我正在为Chrome编写一个扩展,基本上就是使用书签。以下代码在popup html文件中,bookmarkHelper()函数在body onload事件中被调用。它应该检查名为"TestFolder“的书签文件夹是否存在。如果存在,它会删除文件夹中的所有书签。如果没有,它会创建一个空文件夹。
var rootFolder = undefined;
function bookmarkHelper() {
// Create TestFolder folder if it doesn't exist
chrome.bookmarks.getTree(function(tree) {
otherFolder = tree[0].children[1].children;
rootFolder = undefined;
for(i=0; i<otherFolder.length; i++) {
if(otherFolder[i].title == "TestFolder") {
rootFolder = otherFolder[i];
return;
}
}
chrome.bookmarks.create({'parentId': "2",
'title': 'TestFolder'},
function(newFolder) {} );
});
// Remove all bookmarks from the rootFolder
for (i=0; i<rootFolder.children.length; i++)
chrome.bookmarks.remove(rootFolder.children[i].id);
}现在我的问题是,当文件夹中有书签时,它不会删除它们。但如果我将最后3行改为
setTimeout(function(){
for (i=0; i<rootFolder.children.length; i++)
chrome.bookmarks.remove(rootFolder.children[i].id);
}, 100);它会删除书签。在另一种情况下,当我检查弹出窗口时,它会使用原始代码删除书签。这很奇怪,我也不知道是怎么回事。我是不是遗漏了一些匿名函数线程类型的概念?因为AFAIK,JS是单线程的。
发布于 2011-03-07 08:28:24
正确地说,JavaScript是单线程的,但是它经常使用“回调”,当一个特定的函数完成它的工作时就会运行回调,同时允许下面的代码行继续运行。
您传递给chrome.bookmarks.getTree()的函数不会立即执行;相反,它会在chrome.bookmarks.getTree完成其工作后运行,然后传递结果。同时,没有等待,所以下面的代码会立即执行。
将最后三行移动到传递给chrome.bookmarks.getTree的函数中,您可能会得到一些更合理的结果。
https://stackoverflow.com/questions/5214002
复制相似问题