前言
在NodeJS開(kāi)發(fā)中,各種異步操作是不可避免的(好吧,這句明顯是廢話(huà)...)。
開(kāi)發(fā)人員在異步編程上有各種各樣的解決方案可以選擇。我之前一直用的是: Async這個(gè)庫(kù)(star數(shù)量已經(jīng)上萬(wàn)了)。但是,最近看到很多關(guān)于Promise的介紹,甚至連ES6里面都內(nèi)置了這個(gè)東西。感覺(jué)自己不會(huì)用都有點(diǎn)不好意思...
Promise
之前其實(shí)看過(guò)一點(diǎn)Promise相關(guān)的內(nèi)容,但是并不喜歡它處理異步操作的方式(各種Promise對(duì)象),所以就一直拖延下去了...
現(xiàn)在馬上就要過(guò)春節(jié)了,手頭的事情也少了很多,就抽了點(diǎn)時(shí)間看了下。
教程地址
Promise已經(jīng)出來(lái)有一段時(shí)間了,很多公司的技術(shù)團(tuán)隊(duì)博客里面也都寫(xiě)了不少它的教程:
所以我也沒(méi)必要再重復(fù)的造輪子了,這里推薦很不錯(cuò)教程,有點(diǎn)循序漸進(jìn)的味道:
http://liubin.org/promises-book/
看了這篇教程之后,再對(duì)比著看看前面兩個(gè)博客的地址,理解起來(lái)會(huì)更加全面。
筆記
- Promise.resolve(42); 是以下代碼的語(yǔ)法糖。
new Promise(function(resolve){
resolve(42);
});
then中指定的方法調(diào)用是異步進(jìn)行的。 then接受的是函數(shù)!如果是其它類(lèi)型的數(shù)據(jù),promise會(huì)忽視掉。
每個(gè)方法中 return 的值不僅只局限于字符串或者數(shù)值類(lèi)型,也可以是對(duì)象或者promise對(duì)象等復(fù)雜類(lèi)型。
return的值會(huì)由 Promise.resolve(return的返回值); 進(jìn)行相應(yīng)的包裝處理,catch只是 promise.then(undefined, onRejected) 的別名而已。
推薦用這種寫(xiě)法:promise.then(onFulfilled).catch(onRejected) 因?yàn)閛nRejected方法不能捕獲同一個(gè)then方法中的onFulfilled的異常。很好理解。
吐槽
Promise給我的印象,其實(shí)并不好,目前應(yīng)該也不會(huì)馬上把它用到項(xiàng)目里面來(lái)。一方面是因?yàn)锳sync用的非常順手,而Promise功能非常有限,特別是遍歷Promise對(duì)象數(shù)組的時(shí)候。在Async模塊中有各種各樣的方法:each、series、reduce、parallel...
而用Promise來(lái)實(shí)現(xiàn)這些功能,就有點(diǎn)復(fù)雜了,不過(guò)也有第三方庫(kù)在于Promises規(guī)范上,添加了不少功能。比如:
大家可以選一個(gè)看著順眼的來(lái)用。
最主要的原因還是因?yàn)椋篜romise處理異步操作,最底層就是靠回調(diào)函數(shù),但是它硬是搞了一層嵌套,把每一個(gè)異步操作都封裝為一個(gè)Promise對(duì)象,淡化回掉的概念。這理解起來(lái)就真的沒(méi)那么順暢了...
哦,對(duì)了。在ES7中支持了async和await關(guān)鍵字,貌似與Promise更配。
之后有空,再看看吧。(這個(gè)async和提到的Async模塊可不是同一個(gè)東西?。。?/strong>)
本文同步發(fā)表在個(gè)人網(wǎng)站xtutu.me