2012-02-22 68 views

回答

5

我不認爲有很多客觀的優點和缺點。異步非常流行(基於npm packages that depend on it)。

我喜歡控制流庫(特別是異步),因爲它更容易理解。承諾混淆了我,而異步很容易理解。我懷疑它只是一個學習曲線的東西,如果我花費精力去學習它,承諾會更具可讀性。但是,我是否應該期望那些試圖閱讀我的代碼的人呢?

還有第三種 - Fibers。 Fibers不能在Windows上工作,但(IMO)爲應該以串行方式執行的事情提供最清晰的語法。

13

優點回調:

  • 簡單理解和創造。
  • 有點效率更高,因爲更少的對象被創建和垃圾收集。
  • 節點選擇了(error,result)整個回調。我建議遵循他們的論證順序來保持一致。 (而不是說(result1, result2, result3, error)

優點的承諾:

  • 提供一個流暢的界面,有時可以幫助減輕嵌套回調地獄,如shown here。代碼似乎通過鏈接.then(foo).then(bar)調用線性流動。
  • 一個好的承諾庫可以讓你在並行上運行很多異步操作,並且只有在它們全部完成後才能繼續。 Deferred庫通過map無縫地完成此操作,Q具有allResolved,ES6承諾報價Promise.all()。 (這也可以使用回調,例如使用async.parallel(),但不是內置。)
  • 一個好的承諾庫將讓你指定一個錯誤處理函數,如果任何排隊的函數失敗將被調用。要使用回調來做到這一點,需要在每個回調開始時使用一點樣板:if (err) return callback(err);

這將是有意義的使用回調附近底部堆,爲此,將每秒多次運行代碼。更高的堆棧,承諾可能會更好,因爲它們更易於閱讀和理解,並且可以更加優雅地處理錯誤。

值得注意的是,承諾可以在運行時從回調構建。因此,您可以用最低限度的回調形式實現您的核心代碼,並且如果您願意,仍然可以公開庫的承諾版本。 (如在Q.nfbind()。)

我很想聽聽其他優點/缺點。

獎勵建議:總是處理錯誤!使用這兩種方法,如果您不處理錯誤,那麼它將簡單地消失,讓您在黑暗中爲什麼代碼無法按預期工作。

回調應始終處理if (err) ...和承諾應始終有.catch()如果他們不返回。

即使你期望的錯誤有時,並不需要處理那些不處理意外的錯誤意味着你不會聽到來自開發商的錯誤錯誤,如拼寫錯誤,如果代碼在未來發生變化。

Promises的替代.catch()的是聽取unhandled rejections。我個人使用這個來發出警告,.catch()失蹤!

+1

關於perfs的更多信息:http://thanpol.as/javascript/promises-a-performance-hits-you-should-be-aware-of/ – Offirmo 2013-09-17 12:59:54

+0

鏈接不再工作 – Shide 2017-01-25 09:13:06

+1

這是[archived copy of Offirmo的PERF鏈接](http://web.archive.org/web/20160522044854/http://thanpol.as/javascript/promises-a-performance-hits-you-should-be-aware-of)。 – joeytwiddle 2017-01-25 10:35:56

0

我一直在嘗試與此庫聲明的方式:http://chainsjs.org仍然更多的工作做就可以了,但它給你定義一個「執行地圖」在這裏你幾乎可以完全控制流量的能力從簡單的映射執行。

+0

那個網站已經關閉,但今天我在檔案中找到[副本](http://web.archive.org/web/20141217011058/http://chainsjs.org/)。有一個其他控制流庫的列表[這裏](https://github.com/joyent/node/wiki/modules#user-content-wiki-async-flow)。 – joeytwiddle 2015-07-02 09:39:23

+0

@joeytwiddle - 感謝您的提示,當github頁面更改IP時,我從未切換過IP。我剛剛更新了DNS,它應該很快就會備份。 – 2015-07-10 20:17:40