我想编写一个函数来递归浏览节点树,并根据是否存在某个节点来记录其值或创建丢失的节点。这应该很简单,但是我似乎无法绕开它。
我的代码当前如下所示:
let folderName = 'My Folder Name';
function init() {
let hasFolder = false;
let folderId = '';
chrome.bookmarks.getTree(function(itemTree){
itemTree.forEach(function(item){
processNode(item);
});
});
function processNode(node) {
// recursively process child nodes
if (node.children) {
node.children.forEach(function(child) {
processNode(child);
});
}
if (node.title == folderName) {
console.log(folderName + ' folder already exists: ID is ' + node.id);
hasFolder = true;
folderId = node.id;
}
}
}
如果文件夹已经存在,则输出节点ID可以正常工作,但是现在我希望它创建文件夹(如果不存在)。我认为我需要使用一个Promise或回调。创建文件夹的代码很简单:
function createFolder() {
chrome.bookmarks.create({
title: appName,
url: null
}, onBookmarkAdded)
}
如何将其集成到当前功能中?(init()
在首次安装该应用程序时调用。)
看来您应该能够检查hasFolder
回调中的值,并在必要时添加文件夹。像这样:
chrome.bookmarks.getTree(function(itemTree){
itemTree.forEach(function(item){
processNode(item);
if(hasFolder) return;
});
if(!hasFolder){
createFolder();
}
});
我对Chrome的书签API并不熟悉,所以我不能说它是否会抱怨您在getTree
回调内修改书签集合,但是如果没有,这种方法应该可行。
另外,请注意,为了提高效率,您可能希望在forEach
找到文件夹后就退出,以减少不必要的循环(已在上面的代码中添加)。
function processNode(node) {
// recursively process child nodes
if (node.children) {
node.children.forEach(function(child) {
processNode(child);
if(hasFolder) return;
});
}
if (node.title == folderName) {
console.log(folderName + ' folder already exists: ID is ' + node.id);
hasFolder = true;
folderId = node.id;
}
}
使用时
break
,它说:“语法错误:非法break语句” -replacingbreak
与return
似乎工作...哦,对不起,break不能在中使用
foreach
,而只能在标准循环中使用。我将修改答案以使用return代替。