繁体   English   中英

谷歌浏览器javascript数组错误?

[英]Google Chrome javascript array bug?

我正在使用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()添加以下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是一个异步函数。 调用它时,它将立即返回,将书签数据加载到后台。

因此,如果您在调用getallbookmarks()之后立即查看bookmarks.length ,那自然是不完整的。 以后当您单击按钮printlen() ,书签加载将完成,数组将被填充。

appendBMTnode()addchildren()之前,您不知道bookmarks数组是否完整且可以使用。 这就是chrome.bookmark方法采用回调函数而不是仅返回值的原因。

[编辑]:

如何“等待”完成所有内容?

您不能真正做到这一点,JavaScript不能为您提供语言级别的工具(例如线程或协程)来同步运行异步代码,反之亦然。 您将不得不习惯于基于回调函数编写异步代码。

在这种情况下,您可能有一个计数器,每次调用get()getChildren() ,计数器都会增加,并在每个appendBMTnodeaddchildren回调的末尾递减。 如果此时计数器达到零,则没有等待的异步调用,因此您可以调用自己的“完成”回调函数。 回调函数通常被编写为内联函数表达式,以使流程更清晰。

目前,该代码存在的一个问题是,书签数组没有固有的顺序,因为所有内容都是并行调用的。 它不能保证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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM