我正在尝试在目录中创建特定文件的数组;它将通过一些测试用例来确保它符合给定的标准。
我正在使用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/