将 `fs.readdir` 与 `.then` 链接到 return 数组
chaining `fs.readdir` with a `.then` to return an array
我正在尝试在目录中创建一组特定文件;它将通过一些测试用例以确保它符合给定的标准。
我正在使用 fs.readdir
方法,但它没有 return 和 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-extra模块了吗?
如果您想使用承诺而不是回调,您可以承诺 fs
。
const Promise = require('bluebird');
const fs = Promise.promisifyAll(require('fs'));
fs.readdirAsync('./some').then()
fs.readdir
是基于回调的,因此您可以 promisify
使用 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))
我明白了;我只需要使用 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,没有库:
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));
new Promise((resolve, reject) => {
return fs.readdir('/folderpath', (err, filenames) => err ? reject(err) : resolve(filenames))
})
不要err !== undefined
因为错误实际上是null
!!
从 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);
});
您现在可以使用 ES6 解构赋值 (documentation) :
const
fs = require('fs'),
FILES = [...fs.readdirSync('src/myfolder')];
console.log(FILES);
我正在尝试在目录中创建一组特定文件;它将通过一些测试用例以确保它符合给定的标准。
我正在使用 fs.readdir
方法,但它没有 return 和 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-extra模块了吗?
如果您想使用承诺而不是回调,您可以承诺 fs
。
const Promise = require('bluebird');
const fs = Promise.promisifyAll(require('fs'));
fs.readdirAsync('./some').then()
fs.readdir
是基于回调的,因此您可以 promisify
使用 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))
我明白了;我只需要使用 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,没有库:
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));
new Promise((resolve, reject) => {
return fs.readdir('/folderpath', (err, filenames) => err ? reject(err) : resolve(filenames))
})
不要err !== undefined
因为错误实际上是null
!!
从 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);
});
您现在可以使用 ES6 解构赋值 (documentation) :
const
fs = require('fs'),
FILES = [...fs.readdirSync('src/myfolder')];
console.log(FILES);