几种异步处理方案的对比
- promise:
const fs = require('fs'); //nodeJs
//简单封装,fs封装成一个promise
const readFile = function(filename){
return new Promise((resolve,reject)=>{
fs.readFile(fileName,(err,data)=>{
if(err) reject(err);
resolve(data);
})
})
}
//promise
readFile('data/a.txt').then(res=>{
console.log(res.toString());
return readFile('data/b.txt')
}).then(res=>{
console.log(res.toString())
})
2. generator:
```
function * gen(){
yield readFile('data/a.txt');
yield readFile('data/b.txt');
yield readFile('data/c.txt');
}
let g1 = gen();
g1.next().value.then(res=>{
console.log(res.toString())
return g1.next().value;
}).then((res=>{
console.log(res.toString())
return g1.next().value;
})
```
3. async
```
const fs = require('fs'); //nodeJs
//简单封装,fs封装成一个promise
const readFile = function(filename){
return new Promise((resolve,reject)=>{
fs.readFile(fileName,(err,data)=>{
if(err) reject(err);
resolve(data);
})
})
}
//async
async function fn(){ //表明函数里面有异步顺序
let f1 = await readFile('data/a.txt'); //表示后面结果需要等待
console.log(f1.toString());
let f2 = await readFile('data/a.txt')
console.log(f2.toString());
let f3 = await readFile('data/a.txt')
console.log(f3.toString());
}
fn();
async特点
- await只能放在async函数里面
- 相比generator语义化更强
- await 后面可以是promise对象,也可以是数字,字符串,布尔值
- async函数返回的是一个promise对象
- 只要await语句后面promise状态变成reject,那么整个async函数会中断执行;
- 如何解决async函数抛出错误,影响后续代码执行
- 用try catch解决;(推荐,任何async 地方,最好都用try-catch)
- promise.catch;