異步4種情況:
回掉函數(shù)
事件監(jiān)聽
發(fā)布/訂閱
promise
fs.readFile(fileA, (err, data) => {
fs.readFile(fileB, (err, data) => {
fs.readFile(fileC, (err,data)=>{
//do something
})
});
});
為了解決上面的問題Promise出現(xiàn)了任柜,Promise的寫法只是回調(diào)函數(shù)的改進,用then()方法免去了嵌套诺祸,更為直觀。
Promise
從回調(diào)函數(shù),到Promise對象计贰,再到Generator函數(shù),JavaScript異步編程解決方案歷程可謂辛酸蒂窒,終于到了Async/await躁倒。很多人認為它是異步操作的最終解決方案(謝天謝地,這下不用再學(xué)新的解決方案了吧)
其實async函數(shù)就是Generator函數(shù)的語法糖,async不過是把Generator函數(shù)的*號換成async洒琢,yield換成await
function* (){
var f1 = yield readFile('./a.txt');
console.log(f1.toString());
}
async function(){
var f1 = await readFile('./a.txt');
console.log(f1.toString());
// async函數(shù)返回的是一個Promise對象
// 如果直接return 一個直接量(例如此處的'hhh')
// async會把這個直接量通過PromIse.resolve()封裝成Promise對象
}
await后面不僅可以接Promise樱溉,還可以接普通函數(shù)或者直接量。
同時纬凤,我們可以把async理解為一個運算符福贞,用于組成表達式,表達式的結(jié)果取決于它等到的東西
- 等到非Promise對象 表達式結(jié)果為它等到的東西
- 等到Promise對象 await就會阻塞后面的代碼停士,等待Promise對象resolve挖帘,取得resolve的值,作為表達式的結(jié)果
async函數(shù)的優(yōu)點
(1)內(nèi)置執(zhí)行器
Generator 函數(shù)的執(zhí)行必須靠執(zhí)行器恋技,所以才有了 co 函數(shù)庫拇舀,而 async 函數(shù)自帶執(zhí)行器。也就是說蜻底,async 函數(shù)的執(zhí)行骄崩,與普通函數(shù)一模一樣,只要一行薄辅。
(2) 語義化更好
async 和 await要拂,比起星號和 yield,語義更清楚了站楚。async 是“異步”的簡寫脱惰,而 await 可以認為是 async wait 的簡寫。所以應(yīng)該很好理解 async 用于申明一個 function 是異步的窿春,而 await 用于等待一個異步方法執(zhí)行完成拉一。
(3)更廣的適用性
yield 命令后面只能是 Thunk 函數(shù)或 Promise 對象采盒,而 async 函數(shù)的 await 命令后面,可以跟 Promise 對象和原始類型的值(數(shù)值蔚润、字符串和布爾值磅氨,但這時等同于同步操作)。
refer to http://www.reibang.com/p/1c9e9c161612