幾種非同步處理方案的對比
- 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;