实现功能:打印wwwroot下所有的目录
注意如果按照普通逻辑写是不行的,因为在fs里面是异步的。
解决思路:1.改造for循环,递归实现 2.nodejs里面的新特性 async await
1 递归:匿名自执行函数
const fs = require('fs');
var path = './wwwroot';
var dirArr = [];
fs.readdir(path, (err, files) => {
if (err) throw err;
(function getDir(i) {
if (i == files.length) {
console.log(dirArr);
return;
}
fs.stat(path + '/' + files[i], (err, stat) => {
if (stat.isDirectory()) {
dirArr.push(path + '/' + files[i]);
}
getDir(i + 1);
})
})(0)
})
love js,看到了统一性
2 Async Await Promise
Promise 为 ES6,Async Await 为 ES7
2.1 ES6 常见语法
ES6之前:通过回调函数来获取异步方法里面的数据。卧槽。
function getData(callback) {
// ajax
setTimeout(function() {
var name = 'qer';
callback(name);
}, 1000);
}
getData((aaa) => {
console.log(aaa);
})
ES6:Promise
resolve 是成功的回调函数,reject是失败的回调函数
var p = new Promise((resolve, reject) => {
setTimeout(() => {
var name = 'qer';
resolve(name);
}, 1000);
})
/*
将函数封装的写法:
function getData(resolve, reject) {
setTimeout(() => {
var name = 'qer';
resolve(name);
}, 1000);
}
var p = new Promise(getData);
*/
p.then((name) => {
console.log(name);
})
2.2 Async Await
async 让方法变成异步;
await 等待异步方法执行完成。
async 将函数变成异步,这个函数的返回值将变成 Promise
await 必须用在异步方法里面,这时取出来的值不再是 Promise.
比较好理解的例子:
async function test() {
return 'hello';
}
async function main() {
var data = await test();
console.log(data);
}
main();
async 与 Promise 结合:
async function test() {
return new Promise((resolve, reject) => {
setTimeout(() => {
var name = 'qer';
resolve(name);
}, 1000);
})
}
async function main() {
var data = await test();
console.log(data);
}
main();
解决和实现本文开头的问题:
const fs = require('fs');
const { dir } = require('console');
// 1、定义一个异步方法 isDir 来判断一个资源到底是目录还是文件
async function isDir(path) {
return new Promise((resolve, reject) => {
fs.stat(path, (err, stat) => {
if (err) throw err;
if (stat.isDirectory()) {
resolve(true);
} else {
resolve(false);
}
})
})
}
// 2、获取 wwwroot 里面的所有资源 循环遍历
function main() {
var path = '../05 fs/wwwroot';
var dirArray = [];
fs.readdir(path, async (err, files) => { // 此处异步
if (err) throw err;
for (var i = 0; i < files.length; i++) {
if (await isDir(path + '/' + files[i])) {
dirArray.push(files[i]);
}
}
console.log(dirArray);
})
}
main();