好久沒寫東西了,剛好最近有用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
目前還沒太多著墨但我想應該是更好用且各有用武之地吧~