web-dev-qa-db-ja.com

配列を返すために `.then`で` fs.readdir`をチェーンする

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

_fs.readdir_メソッドを使用していますが、promiseが返されません。つまり、Pusharrayに返すことができません。

私のアイデアは、実際に出力したいファイルを配列(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);
});
_
8
grpcMe

私はそれを考え出した; 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);
4
grpcMe

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))
9

単なる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));
5
Marcus Fonseca

コールバックの代わりにpromiseを使用する場合は、fsを約束できます。

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

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

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

2
Karim

fs-extra モジュールを試しましたか?

1
Kristian
new Promise((resolve, reject) => {
    return fs.readdir('/folderpath', (err, filenames) => err ? reject(err) : resolve(filenames))
})

しない err !== undefined errは実際にはnull !!

0
pautasso