我正在开发google chrome扩展程序,我必须遍历节点(文件夹)以检查每个文件夹中有多少项。我正在向功能getBookmarksCount(ID)
提供项目ID。我在从console.log()
的主要功能中获取结果时遇到问题,在记录时返回正确的值。
这是我的代码:
const getBookmarksCount = (bmkNode) => {
let nodes = []
let result = 0
new Promise ((resolve, reject) => {
chrome.bookmarks.getChildren(bmkNode, (bmkChildren) => {
_.each(bmkChildren, (item) => {
// Check if the item is a bookmark link
if (!(item.url === undefined || item.url === null)) {
nodes.push(item.title)
}
})
resolve(_.size(nodes))
})
}).then((size) => {
console.log(size) //The correct number of items is listed here eg. 6
result = size
})
return result
}
//I'm suppling a parent folder ID the function should return number of children
getBookmarksCount(123) // eg. 6 -> at the moment returns 0
这是我没有承诺的更新工作版本。 setTimeout()
是一个肮脏的hack,但是可以工作。有什么建议可以改善此功能吗?
const getBookmarksCount = (bmkNode) => {
let nodes = []
const getChildrenCount = (bmkNode) => {
chrome.bookmarks.getChildren(bmkNode, (bmkChildren) => {
_.each(bmkChildren, (item) => {
// if is bookmark otherwise loop trough subfolder
(!(item.url === undefined || item.url === null)) ? nodes.push(item.title): getChildrenCount(item.id)
})
})
setTimeout(() => {
$(`#counter_${bmkNode}`).html(_.size(nodes))
}, 50)
}
getChildrenCount(bmkNode)
}
// HTML Template
<label class="label label-primary" id="counter_${item.id}">0</label>
答案 0 :(得分:2)
正如Bravo在评论中指出的那样,您并不是真正在等待代码执行。不过,你是如此亲密!
const getBookmarksCount = (bmkNode) => {
return new Promise ((resolve) => {
let nodes = []
chrome.bookmarks.getChildren(bmkNode, (bmkChildren) => {
_.each(bmkChildren, (item) => {
// Check if the item is a bookmark link
if (!(item.url === undefined || item.url === null)) {
nodes.push(item.title)
}
})
resolve(_.size(nodes))
})
})
}
getBookmarksCount(123).then(size => {
console.log(size)
})
请注意第二行的return new Promise
,这是与您提供的代码段的主要区别。这样,您等待在此处“返回”,直到您真正完成异步工作并调用resolve
。然后,要获取返回的值,您将使用与.then
相同的getBookmarksCount
语法。
希望有帮助,当然也可以!