2016-12-20 2 views
1

디렉토리의 모든 폴더를 나열하고 끝 목록의 폴더 수를 지정하고 싶습니다. ,이 fs.readdir 함수의 경쟁 조건은 어디에 있습니까?

  1. 디렉토리 디렉토리 읽기가 완료
  2. 각 폴더의 디렉토리를
  3. 증가 count 읽기 :

    fs.readdir(dir, (err, folders) => { 
        if (err) return console.log(err); 
    
        let count = 0; 
        for (let i = 0; i < folders.length; i++) { 
         let folder = folders[i]; 
    
         fs.stat(dir + '/' + folder, (err, stats) => { 
          if (err) return console.log(err); 
    
          if (stats.isDirectory()) { 
           console.log(folder); 
           count++; 
          } 
          if (i >= (folders.length - 1)) { 
           console.log('folders: ' + count); 
          } 
         }); 
        } 
    }); 
    

    코드는해야

    이 내 코드입니다 로그 'folders: ' + count

대부분의 경우이 작업을 수행하고 난이 얻을 :

... 
2016-12-20--09-59-12 
2016-12-20--09-59-11 
2016-12-20--09-59-14 
folders: 85 
2016-12-20--09-59-13 

가 어디 경쟁 조건이 일어나고있다 :이 얻을 수 있지만 때로는

... 
2016-12-20--09-59-12 
2016-12-20--09-59-13 
2016-12-20--09-59-14 
folders: 86 

를?

답변

1

fs.stats의 콜백 외부에서 증가하기 때문에 fs.stat이 실행을 완료하기 전에 i이 증가하기 때문에 경쟁 조건이 발생한다는 것을 알았습니다.

은 그래서 저는 모든 fs.stats의 완성을 추적하기 위해 별도의 변수 (j)가 필요하고, 이 증가 완료 한 경우에만 나는 count을 나열 할 수 있습니다. 이제 출력은 일관하다

fs.readdir(dir, (err, folders) => { 
    if (err) return console.log(err); 

    let count = 0, 
     j = 0; // this bad boy! 

    for (let i = 0; i < folders.length; i++) { 
     let folder = folders[i]; 

     fs.stat(dir + '/' + folder, (err, stats) => { 
      if (err) return console.log(err); 
      j++; // j, unlike i, only gets incremented *inside* the async function 

      if (stats.isDirectory()) { 
       console.log(folder); 
       count++; 
      } 
      if (j >= folders.length) { // check j, not i 
       console.log('folders: ' + count); 
      } 
     }); 
    } 
}); 

:

... 
2016-12-20--09-59-13 
2016-12-20--09-59-11 
2016-12-20--09-59-14 
folders: 86 
다음

올바른 코드
관련 문제