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 面向对象编程(1) 基础
May 18 Javascript
javascript数组操作总结和属性、方法介绍
Apr 05 Javascript
javascript获取系统当前时间的方法
Nov 19 Javascript
js实现表单提交后不重新刷新当前页面
Nov 30 Javascript
vue2.x+webpack快速搭建前端项目框架详解
Nov 30 Javascript
Vue2.0 v-for filter列表过滤功能的实现
Sep 07 Javascript
js的继承方法小结(prototype、call、apply)(推荐)
Apr 17 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
Sep 12 Javascript
javascript实现摄像头拍照预览
Sep 30 Javascript
详解关闭令人抓狂的ESlint 语法检测配置方法
Oct 28 Javascript
解决vue下载后台传过来的乱码流的问题
Dec 05 Vue.js
TypeScript实用技巧 Nominal Typing名义类型详解
Sep 23 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
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
透析PHP的配置文件php.ini
2006/10/09 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
PHP实现的观察者模式实例
2017/06/21 PHP
php进行md5加密简单实例方法
2019/09/19 PHP
javascript 简单抽屉效果的实现代码
2010/03/09 Javascript
基于jQuery的公告无限循环滚动实现代码
2012/05/11 Javascript
JS瀑布流实现方法实例分析
2016/12/19 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
Vue2.0学习系列之项目上线的方法步骤(图文)
2018/09/25 Javascript
微信小程序学习笔记之目录结构、基本配置图文详解
2019/03/28 Javascript
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
[04:07]显微镜下的DOTA2第八期——英雄复活动作
2014/06/24 DOTA
python的类方法和静态方法
2014/12/13 Python
python中常用检测字符串相关函数汇总
2015/04/15 Python
Python解析json文件相关知识学习
2016/03/01 Python
详解python 爬取12306验证码
2019/05/10 Python
python实现的config文件读写功能示例
2019/09/24 Python
Pytest框架之fixture的详细使用教程
2020/04/07 Python
增大python字体的方法步骤
2020/07/05 Python
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
应届毕业生求职信
2013/11/30 职场文书
计算机专业职业生涯规划范文
2014/01/19 职场文书
家长对孩子评语
2014/01/30 职场文书
企业业务员岗位职责
2014/03/14 职场文书
销售竞赛活动方案
2014/08/23 职场文书
学校四风对照检查材料
2014/08/28 职场文书
机票销售员态度不好检讨书
2014/09/27 职场文书
质量负责人岗位职责
2015/02/15 职场文书
2015年营业员工作总结
2015/04/23 职场文书
Python机器学习之基于Pytorch实现猫狗分类
2021/06/08 Python
Mysql忘记密码解决方法
2022/02/12 MySQL
如何更改Win11声音输出设备?Win11声音输出设备四种更改方法
2022/04/08 数码科技
Python中npy和mat文件的保存与读取
2022/04/24 Python