当咱们以同步的方式编写耗时的代码,那么就会阻塞JS的单线程,形成CPU一直等待IO完成才去执行后面的代码。javascript
而CPU的执行速度是远远大于硬盘IO速度的,这样等待只会形成资源的浪费。java
异步IO就是为了解决这个问题的,异步能尽量不让CPU闲着,它不会在那等着IO完成;而是传递给底层的事件循环一个函数,本身去执行下面的代码。等磁盘IO完成后,函数就会被执行来做为通知。node
虽然异步和回调的编程方式能充分利用CPU,可是当代码逻辑变的愈来愈复杂后,新的问题出现了——Callback hell回调地域!git
实现以下功能:程序员
- 判断一个文件是文件仍是目录;
- 若是是目录,读取这个目录下的文件,找出结尾是txt的文件;
- 获取这些txt文件大小。
function withoutPromise() {
let target = "test";
fs.stat(target, (err, stat)=>{
if(err){
throw err;
}
// 若是是文件夹
if(stat.isDirectory()){
fs.readdir(target, (err, files)=>{
// 遍历files
files.forEach( f =>{
if(path.extname(f) === '.txt'){
fs.stat(path.join(target, f), (err, stat)=>{
console.log(f+ " : "+stat.size);
});
}
} );
});
}
});
}
async function withPromise() {
let target = "test";
//将fs.stat转为一个能够返回Promise对象的方法
let pstat = util.promisify(fs.stat);
let stat = await pstat(target);
// 若是是文件夹
if(stat.isDirectory()){
//将fs.readdir转为一个能够返回Promise对象的方法
let preaddir = util.promisify(fs.readdir)
let files = await preaddir(target)
files.forEach( async (f) => {
if(path.extname(f) === '.txt'){
let stat = await pstat(path.join(target, f));
console.log(stat.size);
}
});
}
}
Promise
和async/await
即是为了解决Callback hell的问题。github
promise
的做用是对异步回调代码包装一下,把原来的一个回调函数拆成2个回调函数,这样的好处是可读性更好。语法以下:编程
// 建立promise对象
let promise = new Promise((resolve, reject)=>{
// 在异步操做成功的状况选调用resolve,失败的时候调用reject
fs.readFile('xxx.txt',(err, data)=>{
if(err){
reject(err)
}else {
resolve(data.toString())
}
})
});
// 使用promise
promise.then((text)=>{
//then方法是当Promise内部调用了resolve的时候执行
}).catch((err)=>{
//catch方法是当Promise内部调用了reject的时候执行
console.log(err);
})
async/await
的做用是直接将Promise异步代码变为同步的写法,注意,代码仍然是异步的。promise
语法要求:异步
await
只能用在async
修饰的方法中,可是有async
不要求必定有await
。await
后面只能跟async
方法和promise
。假设拥有了一个promise对象,如今使用async/await能够这样写:async
async function asyncDemo() {
try {
// 当promise的then方法执行的时候
let text = await promise
// 当你用promise包装了全部的异步回调代码后,就能够一直await,真正意义实现了以同步的方式写异步代码
console.log('异步道明执行');
}catch (e){
// 捕获到promise的catch方法的异常
console.log(e);
}
}
asyncDemo()
console.log('我是同步代码');
promise
包装异步回调代码,可以使用node提供的util.promisify
方法;async/await
编写异步代码。黑马程序员 120天全栈区块链开发 开源教程
https://github.com/itheima1/BlockChain
一番同步了对应的学习视频到B站,长按识别可访问一番B站主页观看。