ディレクトリに特定のファイルの配列を作成しようとしています。これは、いくつかのテストケースを経て、所定の基準に適合していることを確認します。
_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);
});
_
私はそれを考え出した; statSync
の代わりにstat
を使用する必要がありました
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);
fs.readdir
はコールバックベースであるため、bluebirdを使用してpromisify
を実行する(または自分で簡単な実装を作成する)か、次のように呼び出しをpromiseにラップすることができます。
// 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))
単なるjavascript、libsなし:
function foo (folder, enconding) {
return new Promise(function(resolve, reject) {
fs.readdir(folder,enconding, function(err, filenames){
if (err)
reject(err);
else
resolve(filenames);
});
});
};
例えば
foo(someFolder, "someEncoding")
.then((files) => console.log(files))
.catch((error) => console.log(error));
コールバックの代わりにpromiseを使用する場合は、fs
を約束できます。
const Promise = require('bluebird');
const fs = Promise.promisifyAll(require('fs'));
fs.readdirAsync('./some').then()
fs-extra モジュールを試しましたか?
new Promise((resolve, reject) => {
return fs.readdir('/folderpath', (err, filenames) => err ? reject(err) : resolve(filenames))
})
しない err !== undefined
errは実際にはnull
!!