2017-05-17 8 views
0

ディレクトリに特定のファイルの配列を作成しようとしています。いくつかのテストケースを経て、それが所定の基準に適合していることを確認します。`fs.readdir`を` .then`と連鎖して配列を返します

私はfs.readdirメソッドを使用していますが、promiseという意味ではありません。つまり、pushからarrayまでは返されません。

私の考えは、実際に出力したいファイルに配列(arr)を入力し、その配列で何かを行うことでした。しかし、readdirは非同期であり、.then()をチェーン化できないので、私の計画は破棄されます。

私はreaddirSyncでも同じことを試してみました。

const Promise = require('bluebird'); 
const fs = Promise.promisifyAll(require('fs')); 

var arr = []; 

fs.readdirAsync(folder).then(files => { 
    files.forEach(file => { 
    fs.stat(folder + '/' + file, (err, stats) => { 
     if(!stats.isDirectory()) { 
     arr.push(file); 
     return; 
     } 
    }); 
    }); 
}) 
.then(() => { 
    console.log(arr); 
}); 
+0

statstatSyncを使用するために必要な? ---質問を編集して、あなたの努力の[mcve]を含めることができますか? – evolutionxbox

+0

_ "私もreaddirSyncで同じことを無駄にしようとしました" _。その関数は、ファイル名の配列を_return_してくれます。あなたが探しているのとまったく同じように見えますか? – robertklep

+0

私がしようとしていることの例を追加しました。 '[]]を返します。 – OmisNomis

答えて

0

私はそれを理解しました。私はちょうどあなたがコールバックを使用することはできませんなぜ代わりに

const fs = require('fs'); 

var arr = []; 

var files = fs.readdirSync(folder); 

files.forEach(file => { 
    let fileStat = fs.statSync(folder + '/' + file).isDirectory(); 
    if(!fileStat) { 
    arr.push(file); 
    } 
}); 

console.log(arr); 
1

fs-extraモジュールを試しましたか?あなたは、コールバックの代わりに約束を使用したい場合は

0

あなたができるようfs

const Promise = require('bluebird'); 
const fs = Promise.promisifyAll(require('fs')); 

fs.readdirAsync('./some').then() 

http://bluebirdjs.com/docs/api/promise.promisifyall.html

+0

私は何をしようとしているのかの例を追加しました。最後の' .then() 'では' arr'が '[]'を返します。 – OmisNomis

1

fs.readdirは、コールバック、ベースとpromisifyするかpromisifyそれ青い鳥を使用して(または単純な実装を書きますそれのように)、または単に約束で呼び出しを包むようにしてください:

// Wrapped in a promise 
new Promise((resolve, reject) => { 
    return fs.readdir('/folderpath', (err, filenames) => err !== undefined ? reject(err) : resolve(filenames)) 
}) 

またはカスタムpromisify関数:

// Custom promisify 
function promisify(fn) { 
    /** 
    * @param {...Any} params The params to pass into *fn* 
    * @return {Promise<Any|Any[]>} 
    */ 
    return function promisified(...params) { 
    return new Promise((resolve, reject) => fn(...params.concat([(err, ...args) => err ? reject(err) : resolve(args.length < 2 ? args[0] : args)]))) 
    } 
} 

const readdirAsync = promisify(fs.readdir) 
readdirAsync('./folderpath').then(filenames => console.log(filenames)) 
+0

私は、 'arr'配列は' [] 'を返します。私はうまくいけば私がやっていることをクリアする例を追加しました。 'readddir'を使うのはこれが初めてです。それは私が間違って使っている可能性があります。 – OmisNomis

関連する問題