我正在使用Google Chrome扩展程序。在弹出窗口中,我有以下代码:
var bookmarks = [];
function appendBMTnode(node){
bookmarks.push([node[0].title, node[0].id]);
}
function addchildren(results){
for(x = 0; x < results.length; x++){
bookmarks.push([results[x].title, results[x].id]);
chrome.bookmarks.getChildren(results[x].id, addchildren);
}
}
function getallbookmarks(){
chrome.bookmarks.get('0', appendBMTnode);
chrome.bookmarks.getChildren('0', addchildren);
}
getallbookmarks();
console.debug(bookmarks.length);
console.debug(bookmarks);
现在,我假设第一个命令将发布我拥有的#个书签。确实,当我使用Chrome的调试器并在监视列表中添加bookmarks.length时,该值为418。在调试器的控制台中,我可以编写bookmarks.length,它将为我提供正确的长度。我可以打字
for(x = 0; x < bookmarks.length; x++){ console.debug(bookmarks[x]); }
我得到每个内部数组的字符串表示形式。但是,原始的
console.debug(bookmarks.length)
输出为零。而且,如果我将console.debug(bookmarks[0]);
添加到popup.html中,它会告诉我该值是不确定的。但是,如果我将以下内容添加到
getallbookmarks()
(第一个或最后一个):for(x = 0; x < 10; x++){
bookmarks.push(x);
}
然后,bookmarks.length首先将为10,然后为428。同样,当我添加以下函数时:
function printlen(){
console.debug(bookmarks.length);
}
然后在体内,如果我添加
<a href="#" onclick="printlen()">test</a>
那么我还将获得正确的
bookmarks.length
值。有什么线索为什么书签对象不会注册?
最佳答案
chrome.bookmarks.get
是一个异步函数。调用它时,它将立即返回,将书签数据加载到后台。
因此,如果在调用bookmarks.length
之后立即查看getallbookmarks()
,它自然是不完整的。当您以后单击printlen()
按钮时,书签加载到此将完成,并且数组将被填充。
在调用bookmarks
和appendBMTnode()
之前,您不知道addchildren()
数组是否完整且可以使用。这就是chrome.bookmark
方法采用回调函数而不是仅返回值的原因。
[编辑]:
如何“等待”完成所有内容?
您不能真正做到这一点,JavaScript并没有为您提供语言级工具(例如线程或协程)来同步运行异步代码,反之亦然。您将不得不习惯于基于回调函数编写异步代码。
在这种情况下,您可能有一个计数器,每次调用get()
或getChildren()
时,该计数器都会增加,并在每个appendBMTnode
和addchildren
回调的末尾递减。如果此时计数器达到零,则没有等待的异步调用,因此您可以调用自己的“完成”回调函数。回调函数通常被编写为内联函数表达式,以使流程更清晰。
目前,代码存在的一个问题是,书签数组没有固有的顺序,因为所有内容都是并行调用的。它不能保证get()
将在getChildren()
之前返回结果,并且每次addchildren
再次调用getChildren()
时,不同父级的结果可能以任何顺序出现。
考虑改用getTree()
方法。这将使您一次性获得整个书签列表,这可能会更容易处理:
var bookmarks= [];
chrome.bookmarks.getTree(function(marks) {
for (var i= 0; i<marks.length; i++)
bookmarks.push([marks[i].title, marks[i].id]);
// bookmarks is now populated. do code that relies on bookmarks here
});
// at this point bookmarks will still be empty, the callback function hasn't
// happened yet
关于javascript - Google Chrome JavaScript数组错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3190803/