感谢b站教程《Nodejs教程_Nodejs+Koa2入门实战视频教程-2020年更新》
参考:
- 同步异步:https://www.liaoxuefeng.com/wiki/1022910821149312/1023025763380448
- 回调函数callback:
https://blog.csdn.net/rockage/article/details/79513450 - promise:https://www.liaoxuefeng.com/wiki/1022910821149312/1023024413276544
一、同步、异步
fs模块同时提供了异步和同步的方法。回顾一下什么是异步方法。因为JavaScript的单线程模型,执行IO操作时,JavaScript代码无需等待,而是传入回调函数后,继续执行后续JavaScript代码。比如jQuery提供的getJSON()操作:
$.getJSON('http://example.com/ajax', function (data) {
console.log('IO结果返回后执行...');
});
console.log('不等待IO结果直接执行后续代码...');
而同步的IO操作则需要等待函数返回。
// 根据网络耗时,函数将执行几十毫秒~几秒不等:
var data = getJSONSync('http://example.com/ajax');
同步操作的好处是代码简单,缺点是程序将等待IO操作,在等待时间内,无法响应其它任何事件。而异步读取不用等待IO操作,但代码较麻烦。
同步方法不接收回调函数,如果同步读取文件发生错误,则需要用try…catch捕获该错误。
try {
var data = fs.readFileSync('sample.txt', 'utf-8');
console.log(data);
} catch (err) {
// 出错了
}
异步读文件时,可以直接用回调函数捕捉错误。
fs.readFile('sample.png', function (err, data) {
if (err) {
console.log(err);
} else {
console.log(data);
console.log(data.length + ' bytes');
}
});
由于Node环境执行的JavaScript代码是服务器端代码,所以,绝大部分需要在服务器运行期反复执行业务逻辑的代码,必须使用异步代码,否则,同步代码在执行时期,服务器将停止响应,因为JavaScript只有一个执行线程。
服务器启动时如果需要读取配置文件,或者结束时需要写入到状态文件时,可以使用同步代码,因为这些代码只在启动和结束时执行一次,不影响服务器正常运行时的异步执行。
二、递归解决问题2
问题描述:wwwroot文件夹下面有images css js 以及index.html,找出wwwroot目录下所有目录,然后放在一个数组中
var path = './wwwroot'
var dirArr = [];
fs.readdir(path, (err, data)=>{
if(err) {
console.log(err);
return;
}
// 递归实现
(function getDir(i){
if(i == data.length) {
// 执行完成
console.log(dirArr)
return
}
fs.stat(path+'/'+data[i], (error, stats)=>{
if(stats.isDirectory(