好久沒寫東西了,剛好最近有用Nodejs寫一個爬圖小程式,過程中有用到Promise
再加上之前用Express時把所有request都加上了Promise(感覺相當不錯)
當時用它是為了解決兩件事
1.異步調用時避免Callback Hell
2.可以try catch
但是對其原理及併發操作控制並沒有多少研究
就想說藉著這次機會 稍微再深入一點
(不知道Promise是什麼的可以參考這篇gitBook)
後來在網路上搜到一篇還不錯淺顯易懂的文章
說道Promise的順序執行和併發執行
文章中實驗的步驟為先去github上根據使用者名字搜尋出第一位
再去這位的repo中拿第一個repo的名稱
根據此功能有三種模式可以實現
在此引用一下
1.第一步全部執行完,再執行第二步(併發執行)
|---------------|
google1 |---------------|
amazon1 google2
facebook1 amazon2
facebook2
2.每步必須嚴格按照google, amazon, facebook的順序執行(順序執行)
|---------|
google1 |---------|
google2 |---------|
amazon1 |---------|
amazon2 |---------|
facebook1 |--------|
facebook2
3.google1執行完後執行google1,amazon1執行完後執行amazon2,facebook1執行完後執行faceboo2
但對google, amazon, facebook的順序没有要求 (混合執行)
|------------------|
google1 |-------------|
google2
|---------|
amazon1 |-----------|
amazon2
|------------|
facebook1 |-------------|
facebook2
文章中有給出順序執行的解法,其他則沒有(可能是太過簡單…)
所以想說就當作一個練習題自己把它完成
我已將它完成並放在github上
有興趣的可以上去看看跑跑看
其中混合執行的解法我個人認為沒有作者講得那麼複雜
只需要用一個forEach做為第一次的併發
裡面使用順序執行就可以了~
最後這邊就稍微說一下實作後心得
首先關於異步流程控,先與Async.js做個比較
兩者都可以控制流程,但Promise是封裝成物件並使用類似狀態機的方式控制
Async則像是一個工具,可以非常淺顯易懂的調用異步流程
若是你的異步操作簡單且,建議使用Async
但Async還是使用callback來回傳result
所以寫起來比較繁瑣,若再結合併發控制就會更顯複雜
但是Promise只需要封裝好一個一個Promise最後調用就好了
並且目前大部分的Browser都支援Promise了
還是比較推薦大家使用Promise~
不過ES7以後就支援async/await
目前還沒太多著墨但我想應該是更好用且各有用武之地吧~