導(dǎo)讀:
- 分別使用Promise, Generator, async三種異步操作讀取文件,async無(wú)論是語(yǔ)義化 / 代碼優(yōu)雅都有很大優(yōu)勢(shì)鸿摇。
例子:
const fs = require('fs');
// 簡(jiǎn)單封裝 fs封裝成一個(gè)Promise
const readFile = function(fileName) {
return new Promise((resolve, reject) =>{
fs.readFile(fileName, (err, data)=> {
if(err) reject(err);
resolve(data);
});
});
}
// promise
readFile('data/1.txt').then(res =>{
console.log(res.toString());
return readFile('data/2.txt');
}).then(res =>{
console.log(res.toString());
return readFile('data/3.txt');
}).then(res =>{
console.log(res.toString());
});
// generator
function* gen() {
yield readFile('data/1.txt'); // 使用next().value返回的是Promise對(duì)象,故順序調(diào)用時(shí)方法同Promise
yield readFile('data/2.txt');
yield readFile('data/3.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;
}).then(res =>{
console.log(res.toString());
})
// async
async function fn() {
let [a, b ,c] = await Promise.all([
// 由于不指定文件順序劈猿,使用Promise.all()拙吉,指定順序分開(kāi)使用await,注意: 使用await最好加上try{}catch(e){}
readFile('data/1.txt'),
readFile('data/2.txt'),
readFile('data/3.txt')
]);
console.log(a.toString());
console.log(b.toString());
console.log(c.toString());
}
fn();
-
執(zhí)行結(jié)果:
Result
總結(jié):
- async特點(diǎn):
- await只能放到async函數(shù)中
- 相比gengerator語(yǔ)義化更強(qiáng)
- await后面可以是promise對(duì)象揪荣,也可以是數(shù)字筷黔,字符串等
- async函數(shù)返回值是一個(gè)promise對(duì)象
- 只要await語(yǔ)句后面promise狀態(tài)變成了reject,整個(gè)async函數(shù)會(huì)中斷執(zhí)行仗颈, 故一般使用try{}catch(e){}包裹