同步异步问题解决
1、什么是同步代码,什么是异步代码
-
同步:
console.log('before'); console.log('after'); //同步代码的执行顺序是从上到下的,是单线程的,上面代码没有 //没有执行完毕,下面代码是不能执行的
-
异步:定时器,还有node.js里面的异步读取文件
console.log('before'); setTimeout( () => { console.log('last'); }, 2000); console.log('after'); //在这代码里面就有定时器,这就是一个异步代码,他的输出是before,after,last,定时器是 //两秒后执行,所以同步代码先执行完毕,最后异步代码进行执行,在开发的过程中也是如此,所有的 //异步代码都会等同步代码执行完毕在进行执行
2、解决同步异步代码方法
2.1、以异步读取文件为例
2.1.1、异步读取文件的流程
const fs=require("fs");
/**
* readFile 方法是一个异步方法,读取地内容不是通过返回值
* 而是需要提供一个回调函数,会将读取地内容复制给data变量
* 所以只有在回调函数中,才可以获取读取的内容,里面变量err
* 是错误信息地
*
*/
fs.readFile("a.txt","utf8",function(err,data){
console.log(data);
});
2.2、多个异步文件一起读取的问题
fs.readFile("a.txt","utf8",function(err,data){
console.log(data);
});
fs.readFile("b.txt","utf8",function(err,data){
console.log(data);
});
fs.readFile("c.txt","utf8",function(err,data){
console.log(data);
});
fs.readFile("d.txt","utf8",function(err,data){
console.log(data);
});
/**
* 这是多个异步读取文件一起执行,结果是
* 我是c
* 我是a
* 我是d
* 我是b
* 异步读取文件的结果是不可控的,没有顺序的
*/
2.3、多个异步文件一起读取问题的解决方法
2.3.1解决方法一回调函数(不太推荐使用)
fs.readFile("a.txt","utf8",function(err,data){
console.log(data);
fs.readFile("b.txt","utf8",function(err,data){
console.log(data);
fs.readFile("c.txt","utf8",function(err,data){
console.log(data);
fs.readFile("d.txt","utf8",function(err,data){
console.log(data);
});
});
});
});
/**
* 回调函数的方式,在文件读取完a文件后,在读取b文件,读取完b文件以后,在读取c文件
* 以此类推,这样是可以解决异步读取文件顺序不当的问题,
*/
**优点:**自我感觉思路比较清晰,更加好理解
**缺点:**就是代码嵌套很多,不利于代码的维护,这种写法比较落后
2.3.2解决方法二promise(推荐使用)
简单使用方式
/**
* Promise方法的使用
* 1)将异步读取文件的代码放在promise 类的构造函数种
* 2)读取文件成功或者失败后,不直接处理,而是调用resolve和reject函数
*/
let p1=new Promise((resolve,rejects)=>{
fs.readFile('a.txt','utf8',(err,data)=>{
if(err){
rejects('读取文件失败')
}else{
resolve(data);
}
})
})
/**
* ther方法的参数是一个匿名函数,此函数会作为实参赋值给promise中的resolve
* catch方法的参数是一个匿名函数,此函数会作为实参赋值给promise中的rejects
*/
p1.then((data)=>{
console.log(data)
}).catch((err)=>{
console.log(err)
})
/**
* 在进行文件读取的时候所有异步读取文件还是在继续异步无规律的读取中,
* 在输出的时候,读取上一个文件结束后,return调用指定文件在进行输出,
* 这样就控制了异步文件读取输出不受控制的现象了
*/
p1.then((data)=>{
console.log(data)
return p2
}).then(data=>{
console.log(data)
return p3
}).then(data=>{
console.log(data)
return p4
}).then(data=>{
console.log(data)
})
**promise方法总结:**自我理解就是他没有改变异步读取文件读取的顺序,他是在改变读取完以后文件内容输出的顺序(这是自我的理解)