所以我面对的这个问题对我来说似乎很奇怪。似乎无法理解这里发生了什么。 我创建了一个新的数组。将其作为参数传递给填充它的函数。然后在控制台上记录该数组。它正确显示值。但是在下一行,如果我记录数组的长度,它给我一个0
} else {
var path = new Array();
fetchPath(arr[index].parentId,path);
console.log(path);
console.log(path.length);
}
这是fetchPath
function fetchPath( id, path ) {
chrome.bookmarks.getSubTree(id, function(subtree) {
path.push(subtree[0].title);
if(subtree[0].hasOwnProperty('parentId')) {
fetchPath(subtree[0].parentId,path);
}
});
这是我在控制台上获得的
Array[4]
0:"India"
1:"News"
2:"Bookmarks Bar"
3:""
length:4
>_proto_:Array[0]
0
为什么报告的长度为零?事实上无论我尝试和做什么,它都失败了,因为我已经失去了它。 我把整个JS文件放在http://jsfiddle.net/1u4zngko/
答案 0 :(得分:1)
getSubTree方法采用不立即执行的回调函数。 1}}方法在回调执行之前返回,因此路径尚未更新。
答案 1 :(得分:0)
这遇到与Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference中显示的问题相同的问题,但您还有其他问题,然后再回来。
某些浏览器控制台将保留对传递的对象的引用。因此,首先调用异步getSubTree()
,然后记录当前为空的数组及其长度。 但是,因为控制台会保留对您的数组的引用,当您打开它时,它现在会显示已填充的数组。但是,数字按值传递,因此不会更新。
如果您使用console.log(path.slice())
记录数组的克隆,则可以看到这一点 - 它应该为空。
我会在fetchPath()
中使用回调函数修复此问题,如下所示:
function fetchPath( id, path, callback ) {
chrome.bookmarks.getSubTree(id, function(subtree) {
path.push(subtree[0].title);
if(subtree[0].hasOwnProperty('parentId')) {
fetchPath(subtree[0].parentId,path,callback);
}
else {
callback();
}
});