先談JavaScript的異步處理
JavaScript是一門(mén)單線(xiàn)程的編程語(yǔ)言怀估,如果不設(shè)計(jì)異步處理的機(jī)制夫啊,很容易因?yàn)橐恍┖臅r(shí)較長(zhǎng)的I/O而造成線(xiàn)程阻塞崭篡,從而給人不好的程序體驗(yàn)蕊唐。
以前進(jìn)行異步處理的方式:
回調(diào)函數(shù) :可以通過(guò)設(shè)置一些事件的回調(diào)函數(shù)(callBack)從而達(dá)到異步處理
事件監(jiān)聽(tīng) :事件監(jiān)聽(tīng)基本是基于回調(diào)函數(shù)的支持
發(fā)布/訂閱 :發(fā)布訂閱是一種良好的設(shè)計(jì)模式归敬,監(jiān)聽(tīng)發(fā)布者的事件從而達(dá)到異步處理
Promise對(duì)象 :Promise對(duì)象可以解決函數(shù)回調(diào)的嵌套响蓉,但是會(huì)導(dǎo)致代碼的橫向發(fā)展(鏈?zhǔn)讲僮鞯谋锥耍?/p>
ES7的Async
Async是給函數(shù)前面設(shè)置的關(guān)鍵字硕勿,await
是只能在async
作用域下使用關(guān)鍵字,它可以監(jiān)聽(tīng)Promise
對(duì)象枫甲,當(dāng)Promise
對(duì)象的狀態(tài)改變后源武,才進(jìn)行后面的代碼操作扼褪。
幾個(gè)優(yōu)點(diǎn)
- 函數(shù)變成良好的縱向
- 代碼看起來(lái)就像是同步的代碼
- 能夠進(jìn)行標(biāo)準(zhǔn)的
try
和catch
操作
//sleep是一個(gè)設(shè)置的延遲函數(shù)
var sleep = function (time) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
reject() // time 時(shí)間后將Promise的狀態(tài)改為reject
}, time);
})
};
let hello = async() => { //async 作為箭頭函數(shù)的關(guān)鍵字
try {
console.log('i am 1')
await sleep(3000)
console.log(`this won't happen`)
} catch (err) {
console.log('i am 3')
}
}
hello()
console.log('i am 2')
sleep
是一個(gè)延遲函數(shù),調(diào)用的時(shí)候會(huì)在3000
ms之后改變Promise
對(duì)象的狀態(tài)粱栖,所以在try
的作用域內(nèi)會(huì)在執(zhí)行了console.log('i am 1')
之后等待3000
ms话浇,而此時(shí)async
作用域的代碼會(huì)按順序向下執(zhí)行,則會(huì)執(zhí)行到console.log('i am 2')
闹究,當(dāng)在3000
ms之后幔崖,Promise
對(duì)象狀態(tài)變?yōu)?code>reject,這時(shí)會(huì)被catch
檢測(cè)到渣淤,所以不會(huì)再執(zhí)行try
里面的代碼赏寇,而且執(zhí)行catch
下的代碼