Javascript 将`fs.readdir`与`then`链接以返回数组

Javascript 将`fs.readdir`与`then`链接以返回数组,javascript,node.js,fs,Javascript,Node.js,Fs,我试图在一个目录中创建一个特定文件数组;它将通过几个测试用例来确保它符合给定的标准 我使用的是fs.readdir方法,但它不会返回promise这意味着我无法将推送到数组中 我的想法是用我真正想要输出的文件填充一个数组(arr),然后对该数组执行一些操作。但是因为readdir是异步的,我不能将链接到它上。然后()我的计划被取消了 我也用readdirSync尝试过同样的方法,但没有效果 const Promise = require('bluebird'); const fs = Promi

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

我使用的是
fs.readdir
方法,但它不会返回
promise
这意味着我无法
推送到
数组中

我的想法是用我真正想要输出的文件填充一个数组(
arr
),然后对该数组执行一些操作。但是因为
readdir
是异步的,我不能将
链接到它上。然后()
我的计划被取消了

我也用
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);
});

您尝试过模块吗?

如果您想使用承诺而不是回调,您可以promisify
fs

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

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

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

// 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))
//定制承诺
功能承诺(fn){
/**
*@param{…Any}params传递给*fn的参数*
*@return{Promise}
*/
已指定返回函数(…参数){
返回新承诺((解析,拒绝)=>fn(…参数concat([(err,…args)=>err?拒绝(err):解析(args.length<2?args[0]:args)])
}
}
const readdirAsync=promisify(fs.readdir)
readdirAsync('./folderpath')。然后(文件名=>console.log(文件名))

我想出来了;我只需要使用
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);

只需普通javascript,无库:

函数foo(文件夹,编码){
返回新承诺(功能(解决、拒绝){
fs.readdir(文件夹、编码、函数(错误、文件名){
如果(错误)
拒绝(错误);
其他的
解析(文件名);
});
});
};

不要
err!==未定义
,因为err实际上是空的

从Node.js v10开始,有一个API支持这一点:

const fs=require('fs');
var-arr=[];
fs.promises.readdir(文件夹).then(文件=>{
files.forEach(文件=>{
fs.stat(文件夹+'/'+文件,(错误,统计)=>{
如果(!stats.isDirectory()){
arr.push(文件);
返回;
}
});
});
})
.然后(()=>{
控制台日志(arr);
});

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


你为什么不能用回叫您是否可以编辑您的问题以包含您的一些努力?“我在readdirSync上也尝试了同样的方法,但没有效果”。该函数将返回一个文件名数组,在我看来,这正是您要查找的文件名。我已经添加了一个示例,说明我正在尝试执行的操作
arr
returns
[]
刚刚添加了一个我正在尝试执行的示例-在上一个
中。然后()
arr
返回为
[]
我尝试添加一个承诺,但是
arr
数组仍然返回
[]
。我已经添加了一个例子,希望能澄清我正在做的事情。这是第一次使用
readddir
,所以完全有可能我用错了。我必须做错误的事!==无效,但这很有效,谢谢<代码>错误?拒绝(err):解析(文件名)
=>使自err为我返回null后的第一个代码正常工作!哦,糟了,不知道我为什么这么做未定义
,默认行为是返回
null
。。。更新了我的答案,正是我想要的。谢谢,你可以把它简化得更简单。由于您只有一条语句,并且您使用的是箭头函数,因此可以删除大括号和“return”,这样就可以很好地工作。这很漂亮
new Promise((resolve, reject) => {
    return fs.readdir('/folderpath', (err, filenames) => err ? reject(err) : resolve(filenames))
})
const
    fs = require('fs'),
    FILES = [...fs.readdirSync('src/myfolder')];

console.log(FILES);