JavaScript中使用Callback控制流程介绍


Posted in Javascript onMarch 16, 2015

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

作为睿智的你,会选择哪一种呢。

Javascript 相关文章推荐
javascript两段代码,两个小技巧
Feb 04 Javascript
关闭ie窗口清除Session的解决方法
Jan 10 Javascript
jQuery表单域选择器用法分析
Feb 10 Javascript
node.js require() 源码解读
Dec 13 Javascript
js+flash实现的5图变换效果广告代码(附演示与demo源码下载)
Apr 01 Javascript
原生js实现键盘控制div移动且解决停顿问题
Dec 05 Javascript
javascript 中关于array的常用方法详解
May 05 Javascript
JavaScript限定范围拖拽及自定义滚动条应用(3)
May 17 Javascript
通过button将form表单的数据提交到action层的实例
Sep 08 Javascript
实现两个文本框同时输入的实例
Sep 25 Javascript
原生js实现移动端触摸轮播的示例代码
Dec 22 Javascript
关于引入vue.js 文件的知识点总结
Jan 28 Javascript
jquery图片切换插件
Mar 16 #Javascript
JavaScript中的方法重载实例
Mar 16 #Javascript
jquery中attr和prop的区别分析
Mar 16 #Javascript
JavaScript中扩展Array contains方法实例
Aug 23 #Javascript
JavaScript中消除闭包的一般方法介绍
Mar 16 #Javascript
jQuery实现的支持IE的html滑动条
Mar 16 #Javascript
JavaScript计算两个日期时间段内日期的方法
Mar 16 #Javascript
You might like
分页详解 从此分页无忧(PHP+mysql)
2007/11/23 PHP
php is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
php中将一个对象保存到Session中的方法
2015/03/13 PHP
PHP rsa加密解密使用方法
2015/04/27 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
date.parse在IE和FF中的区别
2010/07/29 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
Bootstrap每天必学之警告框插件
2016/04/26 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
2016/12/08 Javascript
JavaScript数据类型的存储方法详解
2017/08/25 Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
2019/11/26 jQuery
解决vue动态路由异步加载import组件,加载不到module的问题
2020/07/26 Javascript
js实现石头剪刀布游戏
2020/10/11 Javascript
vue项目查看vue版本及cli版本的实现方式
2020/10/24 Javascript
JavaScript中arguments的使用方法详解
2020/12/20 Javascript
[06:44]2014DOTA2国际邀请赛-钥匙体育馆开战 开幕式振奋人心
2014/07/19 DOTA
python协程用法实例分析
2015/06/04 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
使用TensorFlow实现二分类的方法示例
2019/02/05 Python
python之生产者消费者模型实现详解
2019/07/27 Python
Python使用for生成列表实现过程解析
2020/09/22 Python
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
adidas爱尔兰官方网站:阿迪达斯运动鞋和运动服
2019/11/01 全球购物
管理部部长岗位职责
2013/12/05 职场文书
大学生职业生涯规划方案
2014/01/03 职场文书
爱牙日活动总结
2014/08/29 职场文书
信用卡工资证明格式
2014/09/13 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
义诊活动总结
2015/02/04 职场文书
小时代观后感
2015/06/10 职场文书
致接力运动员加油稿
2015/07/21 职场文书
大学生村官工作心得体会
2016/01/23 职场文书
党员心得体会范文2016
2016/01/23 职场文书
2016道德模范先进事迹材料
2016/02/26 职场文书
装修安全责任协议书
2016/03/22 职场文书