2017-02-27 7 views
0

特定のキーと値を持つディレクトリ内のすべてのファイルを返す以下のコードがあります。ブール値を持つisDirectoryになりたいキーの1つ。ノード約束の返された値を持つプロミスの戻りオブジェクト

以下のコードはうまく動作しますが、私は約束を超えるPromise.all /反復処理を削除する方法があった場合は疑問に思って、代わりに私のマップで直接私のファイルオブジェクトにstat.isDirectory()の解決された値を押しました。

私のソリューションは、私が試みたが、失敗しました:

が、私はこのような何か試してみました:

isDirectory: fs.statAsync(path).then((stat) => stat.isDirectory()) 

をそしてすべてのisDirectoryキー

ワーキングコードにPromise.allの操作を行います。

const Promise = require('bluebird'), 
    os = require('os'), 
    _ = require('lodash'), 
    fs = Promise.promisifyAll(require('fs')), 
    desktopPath = `${os.homedir()}/Desktop`; 

let files = []; 

return fs.readdirAsync(desktopPath) 
    .then((filesName) => files = _.map(filesName, (fileName) => ({ 
     path: `${desktopPath}/${fileName}`, 
     name: fileName, 
     ext: _.last(fileName.split('.')) 
    }))) 
    .then(() => Promise.all(_.map(files, (file) => fs.statAsync(file.path)))) 
    .then((stats) => _.forEach(stats, (stat, idx) => { 
     files[idx].isDirectory = stat.isDirectory(); 
    })) 
    .then(() => { 
     console.log(files); 
    }) 

最後にPromise.allと_.forEach部分を削除する必要はありますか?代わりに私の地図でその行動をしますか?あなたは、最新のノードを使用していると仮定すると、

答えて

0

- あなたができるasync/awaitは、あなたの関数定義の前にasyncを入れてください:あなたは、すべてのファイルが終了するのを待ちたいので

const fileNames = await fs.readdirAsync(desktopPath); 
const files = await Promise.map(fileNames, fileName => Promise.props({ 
    path: `${desktopPath}/${fileName}`, 
    name: fileName, 
    ext: fileName.split('.').pop(), 
    isDirectory: fs.statAsync(`${desktopPath}/${fileName}`); 
}))); 
console.log(files); 
return files; 
1

あなたは、完全にPromise.allを削除することはできません最終結果を使用する前にしかし、あなたはそれをすべて.then()コールで行うことができます。

mapは同期型なので、fs.statAsyncが終了するのを待たずに終了します。しかし、fs.statAsyncという約束の配列を作成して、最後のファイルオブジェクトを解決し、すべてが完了するのを待つだけでPromise.allを使用することができます。

明確化のためにいくつかのコメントで冗長バージョン:

fs.readdirAsync(desktopPath) 
    .then(fileNames => { 
    // Array of promises for fs.statAsync 
    const statPromises = fileNames.map(fileName => { 
     const path = `${desktopPath}/${fileName}`; 
     // Return the final file objects in the promise 
     return fs.statAsync(path).then(stat => ({ 
     path, 
     name: fileName, 
     ext: _.last(fileName.split(".")), 
     isDirectory: stat.isDirectory() 
     })); 
    }); 
    // Promise.all to wait for all files to finish 
    return Promise.all(statPromises); 
    }) 
    .then(finalFiles => console.log(finalFiles)); 

そしてコンパクト版:

fs.readdirAsync(desktopPath) 
    .then(fileNames => Promise.all(
    fileNames.map(fileName => 
     fs.statAsync(`${desktopPath}/${fileName}`).then(stat => ({ 
     path: `${desktopPath}/${fileName}`, 
     name: fileName, 
     ext: _.last(fileName.split(".")), 
     isDirectory: stat.isDirectory() 
     }))) 
)) 
    .then(finalFiles => console.log(finalFiles)); 
関連する問題