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