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

我正在使用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);
});

最佳答案

fs.readdir是基于回调的,因此您可以使用bluebird或Node.js的promisify包对其util编码(或自己编写一个简单的实现),也可以将调用简单地包装在promise中,如下所示:

// Wrapped in a promise
new Promise((resolve, reject) => {
    return fs.readdir('/folderpath', (err, filenames) => err != null ? 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 - 将 `fs.readdir`与 `.then`链接以返回数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44019316/

10-11 10:25