用`.then`链接`fs.readdir`来返回一个数组

grp*_*cMe 4 javascript fs node.js

我试图在目录中创建一个特定文件的数组; 这将通过一些测试用例来确保它符合给定的标准.

我使用的fs.readdir方法,但它并没有回报promise的意思我不能pusharray.

我的想法是arr使用我实际想要输出的文件填充array(),然后对该数组执行某些操作.但由于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);
});
Run Code Online (Sandbox Code Playgroud)

kri*_*und 7

fs.readdir是基于回调的,所以你可以promisify使用bluebird(或者自己编写一个简单的实现),或者简单地将调用包装在一个promise中,如下所示:

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

或自定义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))
Run Code Online (Sandbox Code Playgroud)


grp*_*cMe 5

我想到了; 我只需要使用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);
Run Code Online (Sandbox Code Playgroud)


Mar*_*eca 5

只是纯JavaScript,没有库:

function foo (folder, enconding) {
    return new Promise(function(resolve, reject) {
        fs.readdir(folder,enconding, function(err, filenames){
            if (err) 
                reject(err); 
            else 
                resolve(filenames);
        });
    });
};
Run Code Online (Sandbox Code Playgroud)

例如

foo(someFolder, "someEncoding")
.then((files) => console.log(files))
.catch((error) => console.log(error));
Run Code Online (Sandbox Code Playgroud)