JavaScript中使用Callback控制流程介绍
作者:bea
javascript中随处可见的callback对于流程控制来说是一场灾难,缺点显而易见: 1.没有显式的return,容易产生多余流程,以及由此引发的bug。 2.造成代码无限嵌套,难以阅读。 下面就来说说怎么解决避免上述的问题。 第一个问题是一个习惯问题,在使用callback的时候往往会让人忘了使用return,这种情况在使用coffee-script的时候尤甚(虽然它在编译成javascript时会自行收集最后的数据作为返回值,但是这个返回值并不一定代表你的初衷)。看
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)->
作为睿智的你,会选择哪一种呢。
有用 | 无用
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)->
作为睿智的你,会选择哪一种呢。
有用 | 无用
猜你喜欢
您可能感兴趣的文章:
- jQuery实现按键盘方向键翻页特效
- javascript操作Cookie(设置、读取、删除)方法详解
- jQuery选择id属性带有点符号元素的方法
- jQuery统计指定子元素数量的方法
- jquery让指定的元素闪烁显示的方法
- 多个jQuery版本共存的处理方案
- jquery通过closest选择器修改上级元素的方法
- jQuery判断元素上是否绑定了指定事件的方法
- jQuery验证元素是否为空的两种常用方法
- jQuery在ul中显示某个li索引号的方法
- jQuery支持动态参数将函数绑定到事件上的方法
- jQuery实现预加载图片的方法
- jQuery检测鼠标左键和右键点击的方法
- jQuery对指定元素中指定字符串进行替换的方法
- jQuery经过一段时间自动隐藏指定元素的方法
- input输入框鼠标焦点提示信息
- 原生JS实现LOADING效果
- 使用jQuery实现图片遮罩半透明坠落遮挡
- jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图