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

时间:2017-05-17 08:21:36

标签: javascript node.js fs

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

我正在使用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 个答案:

答案 0 :(得分:6)

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

promisify

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

promisify

答案 1 :(得分:3)

纯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);
        });
    });
};

例如

foo(someFolder, "someEncoding")
.then((files) => console.log(files))
.catch((error) => console.log(error));

答案 2 :(得分:2)

如果您想使用承诺而不是回调,则可以宣传/etc/resolv.conf

fs

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

答案 3 :(得分:2)

我明白了;我只需要使用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 :(得分:1)

您是否尝试过fs-extra模块?

答案 5 :(得分:1)

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

不要err !== undefined,因为错误实际上是null

答案 6 :(得分:1)

您现在可以使用 ES6解构分配documentation)了:

const
    fs = require('fs'),
    FILES = [...fs.readdirSync('src/myfolder')];

console.log(FILES);

答案 7 :(得分:0)

从Node.js v10开始,有一个fs.promises API支持此功能:

const fs = require('fs');

var arr = [];

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