JavaScript中使用Callback控制流程程介紹_javascript技巧

來源:互聯網
上載者:User

javascript中隨處可見的callback對於流程式控制制來說是一場災難,缺點顯而易見:

1.沒有顯式的return,容易產生多餘流程,以及由此引發的bug。
2.造成代碼無限嵌套,難以閱讀。

下面就來說說怎麼解決避免上述的問題。

第一個問題是一個習慣問題,在使用callback的時候往往會讓人忘了使用return,這種情況在使用coffee-script的時候尤甚(雖然它在編譯成javascript時會自行收集最後的資料作為傳回值,但是這個傳回值並不一定代表你的初衷)。看看下面的例子。

複製代碼 代碼如下:

a = (err, callback)->
  callback() if err?
  console.log 'you will see me'

b = ->
  console.log 'I am a callback'

a('error', b)

在這種所謂”error first”的代碼風格中,顯然我們不希望出錯時方法a中的後續代碼仍然被執行,但是又不希望用throw來讓整個進程掛掉(要死也得優雅的死嘛~),那麼上面的代碼就會產生bug。

一種解決方案就是老老實實的寫if...else...,但是我更傾向於下面的做法:

複製代碼 代碼如下:

a = (err, callback)->
  return callback() if err?
  console.log 'you will not see me'

b = ->
  console.log 'I am a callback'

a('error', b)

javascript非同步方法呼叫中的傳回值大多沒什麼用處,所以這裡用return充當一個流程式控制制的角色,比if...else...更少的代碼,但是更加清晰。

第二個問題是娘胎裡帶來的,很難根除。

一種不錯的方法是使用一些流程式控制制模組來將代碼顯得更加有條理,比如async就是一個不錯的模組,提供了一系列的介面,包括迭代,迴圈,和一些條件陳述式,甚至還包含了一個隊列系統。下面的例子可以表名兩種寫法的優劣

複製代碼 代碼如下:

#normal

first = (callback)->
  console.log 'I am the first function'
  callback()

second = (callback)->
  console.log 'I am the second function'
  callback()

third = ()->
  console.log 'I am the third function'

first ->
  second ->
    third()

# use async

async = require('async')

async.waterfall [
  first,
  second,
  third
], (err)->

作為睿智的你,會選擇哪一種呢。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.