2014-03-04 2 views
2

Google 크롬의 파일 시스템 API를 사용하여 파일을 검색하기 위해 디렉토리를 반복 실행하려고합니다.호출되지 않는 함수 알아보기

온라인 012 files.push(file);에서 files 배열을 채우려 고 시도하는 것이 불려지지는 않습니다. 그러나 이것을 console.log(file);으로 바꾸면 갑자기 작동하지만 그 기능 만 있습니다.

아무도 무슨 일이 일어나고 있고 내가 뭘 잘못하고 있는지 설명 할 수 있습니까? 보려면 다음 JSFiddle 상자에 어떤 디렉토리를 삭제 :

http://jsfiddle.net/tekky/ZXU8v/8/

코드 :이console.log(file) 후 각 파일 에 대한 반환 있도록

var dndbox = $(".dndbox")[0]; 

dndbox.addEventListener("dragenter", function(e) { 
    e.stopPropagation(); 
    e.preventDefault(); 
},false); 

dndbox.addEventListener("dragover", function(e) { 
    e.stopPropagation(); 
    e.preventDefault(); 
},false); 

dndbox.addEventListener("drop", function(e) { 
    e.stopPropagation(); 
    e.preventDefault(); 

    var itemList = e.dataTransfer.items; 

    var files = []; 

    var traverse = function(entry) 
     { 
      if (entry.isFile) { 
       entry.file(function(file){ 
        files.push(file); 
       }); 
      } else if (entry.isDirectory){ 
       var dR = entry.createReader(); 
       dR.readEntries(function(entries) { 
        for(var i = 0; i < entries.length; i++) 
        { 
         traverse(entries[i]); 
        } 
       }); 
      } 
     } 

     for(var i = 0; i < itemList.length; i++) { 
      var e = itemList[i].webkitGetAsEntry(); 
      traverse(e); 
     } 

    console.log(files); //Empty? 

},false); 

답변

1

당신이 entry.file()에 제공하는 콜백, 비동기입니다.

줄에 console.log(files)을 삽입하면 각 콜백이 실행될 때 업데이트 된 것을 확인할 수 있습니다. 따라서 모든 파일을 가지고 뭔가를하고 싶다면 모든 콜백이 실행될 때까지 기다려야합니다.

다음은 모든 파일이 반환 될 때까지 기다리는 간단한 예입니다. http://jsfiddle.net/6Tn8W/.

promises도 확인하시기 바랍니다.

편집 : 다음은 약속 및 when() 기능을 사용하는 예입니다. 이것은 내가 약속 jQuery의 구현을 처음 사용, 그래서이

http://jsfiddle.net/Lsuz2/

+0

약속 보이는 ... 도니는 다르게 약속을 :) 할 수있는 더 좋은 방법이 될 수 있습니다. 그러나 단 한 번만 resolve를 호출 할 수 있습니다. 함수가 재귀 적이기 때문에 어떻게이 문제를 해결할 수 있습니까? 귀하의 답변과 함께 사례를 제공하는 데주의하십시오. – Tek

+0

내 대답이 업데이트되었으며, 나 자신도 몇 가지 사실을 알게되었습니다! :) – user1234

+0

정말 고마워요! 너무 나쁜 표준 JS에는'.when()'이 없습니다. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise 이것을 사용하여 구현하고 싶었지만 가능하지 않니? – Tek

관련 문제