国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 語(yǔ)言 > JavaScript > 正文

JavaScript中使用Callback控制流程介紹

2024-05-06 16:16:58
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這篇文章主要介紹了JavaScript中使用Callback控制流程介紹,本文講解了callback的一些問(wèn)題和優(yōu)化后的寫(xiě)法并給出代碼實(shí)例,需要的朋友可以參考下
 

javascript中隨處可見(jiàn)的callback對(duì)于流程控制來(lái)說(shuō)是一場(chǎng)災(zāi)難,缺點(diǎn)顯而易見(jiàn):

1.沒(méi)有顯式的return,容易產(chǎn)生多余流程,以及由此引發(fā)的bug。
2.造成代碼無(wú)限嵌套,難以閱讀。

下面就來(lái)說(shuō)說(shuō)怎么解決避免上述的問(wèn)題。

第一個(gè)問(wèn)題是一個(gè)習(xí)慣問(wèn)題,在使用callback的時(shí)候往往會(huì)讓人忘了使用return,這種情況在使用coffee-script的時(shí)候尤甚(雖然它在編譯成javascript時(shí)會(huì)自行收集最后的數(shù)據(jù)作為返回值,但是這個(gè)返回值并不一定代表你的初衷)??纯聪旅娴睦?。

 

復(fù)制代碼代碼如下:

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

 

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

a('error', b)

 

在這種所謂”error first”的代碼風(fēng)格中,顯然我們不希望出錯(cuò)時(shí)方法a中的后續(xù)代碼仍然被執(zhí)行,但是又不希望用throw來(lái)讓整個(gè)進(jìn)程掛掉(要死也得優(yōu)雅的死嘛~),那么上面的代碼就會(huì)產(chǎn)生bug。

一種解決方案就是老老實(shí)實(shí)的寫(xiě)if...else...,但是我更傾向于下面的做法:

復(fù)制代碼代碼如下:

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異步方法中的返回值大多沒(méi)什么用處,所以這里用return充當(dāng)一個(gè)流程控制的角色,比if...else...更少的代碼,但是更加清晰。

第二個(gè)問(wèn)題是娘胎里帶來(lái)的,很難根除。

一種不錯(cuò)的方法是使用一些流程控制模塊來(lái)將代碼顯得更加有條理,比如async就是一個(gè)不錯(cuò)的模塊,提供了一系列的接口,包括迭代,循環(huán),和一些條件語(yǔ)句,甚至還包含了一個(gè)隊(duì)列系統(tǒng)。下面的例子可以表名兩種寫(xiě)法的優(yōu)劣

復(fù)制代碼代碼如下:

#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)->

 

作為睿智的你,會(huì)選擇哪一種呢。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 雅安市| 汤原县| 诸城市| 怀宁县| 房产| 宝山区| 东平县| 清流县| 泗水县| 穆棱市| 徐水县| 根河市| 洛隆县| 商水县| 顺义区| 额敏县| 普陀区| 济宁市| 凤山市| 马关县| 澄江县| 英德市| 泰兴市| 华池县| 南城县| 民勤县| 林州市| 同德县| 张家界市| 奉化市| 南城县| 黄梅县| 蒙自县| 军事| 凭祥市| 潮州市| 互助| 民丰县| 利川市| 宁武县| 博罗县|