2016-07-26 53 views
1

我試圖建立與科爾多瓦一個函數,它給了我一個JSON對象,如下所示:如何獲得所有文件和文件夾結構的JSON對象

{ 
    "file:///storage/emulated/0/Android/data/test/files/data/bla.txt": "bla.txt", 
    "file:///storage/emulated/0/Android/data/test/files/data/HelloWorld.txt": "HelloWorld.txt", 
    "file:///storage/emulated/0/Android/data/test/files/data/RSC/picture-1469199158993.jpg": "picture-1469199158993.jpg", 
    "file:///storage/emulated/0/Android/data/test/files/data/RSC/picture-1469199665434.jpg": "picture-1469199665434.jpg", 
    "file:///storage/emulated/0/Android/data/test/files/data/API-Test/test/datFile.txt": "datFile.txt", 
    "file:///storage/emulated/0/Android/data/test/files/data/RSC/thumbnails/picture-1469199158993.jpg": "picture-1469199158993.jpg", 
    "file:///storage/emulated/0/Android/data/test/files/data/RSC/thumbnails/picture-1469199665434.jpg": "picture-1469199665434.jpg" 
} 

我的問題是,科爾多瓦功能是異步所以我的函數返回一個空對象。

這裏是我的解決方案迄今:

var dirObj = new Object(); 

function getFiles(fullPath, callback){ 
    dirObj = new Object(); 

    window.resolveLocalFileSystemURL(fullPath, addFileEntry, function(e){ 
      console.error(e); 
    }); 

    return JSON.stringify(dirObj);  
} 

var addFileEntry = function (entry) { 
    var dirReader = entry.createReader(); 
    dirReader.readEntries(
    function (entries) { 
     var fileStr = ""; 
     for (var i = 0; i < entries.length; i++) { 
     if (entries[i].isDirectory === true) { 
      addFileEntry(entries[i]); 
     } else { 
      dirObj[entries[i].nativeURL] = entries[i].name; 
      console.log(entries[i].fullPath); 
     } 
     } 
    }, 
    function (error) { 
     console.error("readEntries error: " + error.code); 
    } 
); 
}; 

注:無極()是不是一種選擇,因爲功能必須在Chrome 30.0和承諾(工作)是avaible自32.0(src)。

+0

您可以使用回調或承諾填充(例如Bluebird)嗎? – gcampbell

+0

[等待異步任務完成]可能的重複(http://stackoverflow.com/questions/18729761/wait-for-async-task-to-finish) – AxelH

+0

@AxelH以及如何確定遞歸函數是否完成調用回調?遞歸函數調用自己是異步的。 – Durzan

回答

0
var dirObj; 

function getFiles(fullPath, callback){ 
    dirObj = new Object(); 

    window.resolveLocalFileSystemURL(fullPath, addFileEntry, function(e){ 
      console.error(e); 
    }); 
} 

var counter = 0; 

var addFileEntry = function (entry) { 
    ++counter; 
    var dirReader = entry.createReader(); 
    [...] //you probably should do it in the readEntries function to since this is async to (as you said), because this could still run while the following line might be executed. If so, just add the same if(...) callback(); 
    if(--counter == 0) 
     callBack(); 
}; 

function callBack(){ 
    var json = JSON.stringify(dirObj); 
    //Do what you need with it. 
} 
0

我發現了一個類似於@AxelH建議解決方案的解決方案。 我使用了一個數組: 每次我調用addFileEntry函數時,我都會將一個id推入數組中。當函數完成時,我從數組中刪除了id。如果數組爲空,我調用回調函數。

謝謝@AxelH的幫助和感謝@ gcampbell提到藍鳥,我不知道和將用於在JavaScript中的其他異步問題。

+0

是的,使用數組和增量變量是一樣的,但是由於需要生成id然後再次找到它,這有點重。讓我按照自己的方式寫下來,這樣你就可以關閉這個問題,如果這對你來說可以的話 – AxelH

+0

當然可以。我認爲這對其他人也有幫助。 – Durzan

相關問題