2014-12-06 15 views
0

所以我面臨的這個問題對我來說似乎很奇怪。似乎無法理解這裏發生了什麼。 我創建一個新的數組。將它作爲參數傳遞給填充它的函數。然後在控制檯上記錄數組。它正確顯示值。但在非常下一行,如果我登錄了數組的長度,它給了我一個0在下一行丟失Javascript數組

} 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

的[爲什麼是我的變量不變後,我修改一個函數中可能重複? - 異步代碼引用](http://stackoverflow.com/questions/23667086/why-is-my-variable-unaltered-after-i-modify-it-inside-of-a-function-asynchron) – Scimonster 2014-12-06 18:04:42

+0

但我做在呼叫者身邊獲得正確的內容。一旦我能夠記錄內容。然後在下一行我丟失了內容 – 2014-12-06 18:12:24

+0

,所以我再次看到路徑已經填充了長度爲4的內容。一旦完成,爲什麼下一行報告爲零。 – 2014-12-06 18:16:58

回答

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(); 
    } 
}); 
+0

我最終使用了promise。有效 。謝謝! – 2014-12-07 14:00:18

1

getSubTree方法採用的回調函數不會立即執行。您的fetchPath方法在執行回調之前正在返回,所以路徑尚未更新。