2017-07-08 3 views
2

Ich versuche rekursiv einen Verzeichnisbaum zu gehen und alle Dateinamen zu sammeln. Im folgenden Code, jedoch läuft der console.log() am Ende zu früh warten, nicht für die von der Funktion des rekursiven cacheDir Aufruf erzeugt Versprechen zu beheben:Warten, bis alle Versprechen gelöst sind, während ich rekursiv ein Verzeichnis durchläuft

function cacheDir(dir) { 
    return fs.readdir(dir).then(items => { 
    const readDirPromises = [] 

    for (let item of items) { 
     const fullPath = path.join(dir, item) 
     const lstat = fs.lstat(fullPath) 
     readDirPromises.push(lstat) 

     lstat.then(stats => { 
     if (stats.isFile()) { 
      return fullPath 
     } else { 
      return cacheDir(fullPath) 
     } 
     }) 
    } 

    return Promise.all(readDirPromises) 
    }) 
} 

cacheDir("../someDir/") 
    .then(results => console.log('done!', results)) 

Was mache ich falsch? Es scheint mir, dass readDirPromises wird ein Array von strings und verspricht, jedes Versprechen von denen wird sich zu einer Reihe von Strings und verspricht zu lösen.

Antwort

3

Das Versprechen, auf das Sie mit Promise.all() warten müssen, muss lstat.then() sein, nicht nur lstat. Denken Sie daran, dass lstat.then() eine neue Zusage zurückgibt und diese neue Zusage alle Versprechungen nachverfolgt, die innerhalb des -Handlers zurückgegeben werden, den Sie aufgrund Ihrer Rekursion benötigen.

Hier ist eine Version, die das tut (und wird von einigen temporären Variablen zu befreien):

function cacheDir(dir) { 
    return fs.readdir(dir).then(items => { 
    const readDirPromises = []; 

    for (let item of items) { 
     const fullPath = path.join(dir, item); 

     readDirPromises.push(fs.lstat(fullPath).then(stats => { 
     if (stats.isFile()) { 
      return fullPath; 
     } else { 
      return cacheDir(fullPath); 
     } 
     })); 
    } 

    return Promise.all(readDirPromises) 
    }) 
} 
+0

Dank, war nicht klar, dass 'dann()' ein neues Versprechen gibt! – maxedison

+0

@maxedison - So funktioniert die Verkettung. Das neu zurückgegebene Versprechen wartet auf jede Zusage, die von der '.then()' zurückgegeben wird, und so erhalten Sie eine Kette. – jfriend00

Verwandte Themen