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);
});
您尝试过模块吗?如果您想使用承诺而不是回调,您可以promisifyfs
const Promise = require('bluebird');
const fs = Promise.promisifyAll(require('fs'));
fs.readdirAsync('./some').then()
fs.readdir
是基于回调的,因此您可以使用bluebird或Node.jsutil
包(或自己编写一个简单的实现),或者简单地将调用封装在承诺中,如下所示:
// 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);