这些同步异步的坑必须亲自踩
我相信,肯定每个人都学了 但是一做就没注意到。
所以现在也没指望大家能记住,只是希望有一天遇到了,能够搜到-=-
不讲原理的,直接进行完整程序。
我的需求:封装一个函数来创建文件夹
功能 1.随机文件夹名字。
功能 2.可以控制文件夹的生成量和文件夹字符串数。
我封装了两个函数,一个传入一个参数生成随机字符串作为文件夹名字,一个函数创建文件夹。第二函数会调用第一个函数。第二个函数封装一个循环,传入两个参数,一个控制循环次数,一个传给随机生成字符串函数。
是不是感觉很简单……,,,没错没错是很简单啊。但是让我痛心了半天啊。
我是这次使用的是nodejs,有了这次经历,我也明白了之前用python是为什么出现瞎循环、乱循环了。
之前也是有专门学过主进程、子进程、同步、异步的,(感兴趣可以看一下我之前写的bat、python、nodejs之前的相互调用及相互传参)
且,我相信我们大部人在学到同步、异步的时候都感觉异步的方法很好,异步不影响主进程,甚至我们都不太注重同步的方法,一头专进异步回调函数的牛角尖,以至于需要同步方法时,还想着哪里写回调函数。
粘一下代码
var fs=require("fs");
// 一个函数生成随机字符串
function randomName(i){
let letterArr=["a","b","c","d","e","f","g","h","i","j"];
var j=0;
var dirname="";
while(j<i){
dirname=dirname+letterArr[Math.floor(Math.random()*10)];
j++;
}
return dirname;
}
// let a=randomName(5);
// console.log(a);
// 开始创建文件夹
function makeDir(j,k){
var i=0;
while(i<=j){
let name=randomName(k);
fs.stat("bdcih.txt",(err,data)=>{
if(err){
console.log("1");
console.log(err);
fs.mkdir(name,(err)=>{
if(err) throw err;
});
i++;
console.log(i);
return ;
}
if(data.isDirectory()){
// 目录存在
console.log("2");
}else{
// console.log("3");
fs.mkdir(name,(err)=>{
if(err) throw err;
});
i++;
console.log(i);
}
})
}
}
makeDir(5,5);
是不是好像没什么问题
代码是完整的,大家可以尝试运行一下
我直接说问题所在吧,问题就在于fs.stat它是一个异步的方法啊,异步啊主程序不结束永远不执行啊。
所以上面的代码其实执行了一个死循环
var fs=require("fs");
// 写一个函数生成随机字符串
function randomName(i){
let letterArr=["a","b","c","d","e","f","g","h","i","j"];
var j=0;
var dirname="";
while(j<i){
dirname=dirname+letterArr[Math.floor(Math.random()*10)];
j++;
}
return dirname;
}
// let a=randomName(5);
// console.log(a);
// 开始创建文件夹
function makeDir(j,k){
var i=0;
while(i<=j){
let name=randomName(k);
/* 这里不执行,你们说是不是死循环
fs.stat("bdcih.txt",(err,data)=>{
if(err){
console.log("1");
console.log(err);
fs.mkdir(name,(err)=>{
if(err) throw err;
});
i++;
console.log(i);
return ;
}
if(data.isDirectory()){
// 目录存在
console.log("2");
}else{
// console.log("3");
fs.mkdir(name,(err)=>{
if(err) throw err;
});
i++;
console.log(i);
}
})
*/
}
}
上面注释的代码是不会在主程序结束前执行的。