我是JavaScript的新手,我一直在尝试创建Chrome扩展程序。 Chrome扩展程序基本上会搜索某组“书签”并将其添加到数组中。我认为使用代码更容易解释:
public ActionResult GetExportStatus()
{
EmailStatusLogRepository objEmailStatusRepository = new EmailStatusLogRepository();
return PartialView("_exportedReportList", objEmailStatusRepository.GetExportStatus());
}
需要注意的一点是:var books = []在全局范围内声明并初始化,函数search_for_title recurses,并在此代码段的末尾调用getBookmarks()以启动代码。
现在,我通常来自Java和C ++背景,其中一切都是线性的,并且没有这些我不熟悉的“回调”函数。所以,我认为输出应该是:
书签!
- 打印出“Music”文件夹中的所有书签,然后返回到getBookmarks功能 -
项:...
项:...
项:...
...
书籍:625 **(书籍的长度)**
最终预订:625
但是,我得到的输出是:
书签! 这很好
书籍:0 为什么会在开头? 此值应为625
最终预订:0 为什么程序中的最后一行代码几乎在开头? 此值应为625
< / LI>- 找到的所有书签 - 这很好
图书长度:0 这应该接近程序的开头,如第二行 正确值0
我可以直接访问search_for_title方法中的全局“books”数组,但由于某种原因,它总是告诉我数组的长度为0.此外,我的代码由于某种原因似乎没有任何线性路径,它只是跳到了整个地方。此外,当程序打印出每个单独的书签时,它会打印出正确长度的书籍数组(即书籍[599] = Nero - Promises - YouTube,书籍长度:600),但为什么它总是说长度为0返回getBookmarks函数?
答案 0 :(得分:1)
JavaScript以线性方式运行,但chrome.bookmarks.getTree
方法是异步调用。这意味着#getTree方法之后的代码不会等到方法完成。
在JavaScript函数中是第一类对象。回调函数被传递到#getTree方法,该方法在执行自己的逻辑后执行参数函数。
在您当前的代码中,每次异步调用将花费不同的时间完成时,您的日志结果每次都会略有不同。您应该能够通过简单地在回调函数中移动循环和日志代码来完成这项工作。
function getBookmarks(){
console.log("Bookmarks!");
chrome.bookmarks.getTree(function(bookmarks){
search_for_title(bookmarks, "Music", null, books); //Collect all bookmarks in the "Music" folder and put them into the books array
for(var i = 0; i < books.length; i++){ //Once all bookmarks are added to the books array, loop through all of them
console.log("ITEM: " + books[i]);
}
console.log("books: " + books.length); //Print out the length of the books array
});
}