遍历chrome.bookmarks.getChildren

时间:2018-11-07 04:46:50

标签: javascript google-chrome-extension promise underscore.js

我正在开发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>

1 个答案:

答案 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语法。

希望有帮助,当然也可以!