JavaScript中使用Callback控制流程介绍

 更新时间:2015年03月16日 11:53:23   投稿:junjie  
这篇文章主要介绍了JavaScript中使用Callback控制流程介绍,本文讲解了callback的一些问题和优化后的写法并给出代码实例,需要的朋友可以参考下

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

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

相关文章

  • 兼容IE和FF的js脚本代码小结(比较常用)

    兼容IE和FF的js脚本代码小结(比较常用)

    做BS开发就难免会用到javascript,而每个浏览器对javascript的支持有不同。这就需要我们程序员去兼容他们下面是兼容IE和FF的js脚本做法和分解(部分选自网上,经本人整理),希望对大家有帮助。
    2010-12-12
  • ES6 proxy和reflect的使用方法与应用实例分析

    ES6 proxy和reflect的使用方法与应用实例分析

    这篇文章主要介绍了ES6 proxy和reflect的使用方法,结合具体实例形式分析了ES6 proxy和reflect基本功能、原理、使用方法与操作注意事项,需要的朋友可以参考下
    2020-02-02
  • js关闭浏览器时退出账号的处理

    js关闭浏览器时退出账号的处理

    某些网站,尤其是涉及钱的网站,现在基本都有一个机制是两小时后登陆自动失效,要重新登陆确认身份,那么js关闭浏览器时退出账号如何实现,感兴趣的可以了解一下
    2021-12-12
  • JS中的prototype与面向对象的实例讲解

    JS中的prototype与面向对象的实例讲解

    JS中的prototype与面向对象的实例讲解,需要的朋友可以参考一下
    2013-05-05
  • 浅谈JavaScript中Date(日期对象),Math对象

    浅谈JavaScript中Date(日期对象),Math对象

    这篇文章主要简单介绍了JavaScript中Date(日期对象),Math对象的相关资料,需要的朋友可以参考下
    2015-02-02
  • JS/jQuery实现默认显示部分文字点击按钮显示全部内容

    JS/jQuery实现默认显示部分文字点击按钮显示全部内容

    默认显示部分文字,点击按钮显示全部,类似这样的功能在一些特殊的地方会见到吧,下面与大家分享下JS、jQuery如何实现,感兴趣的朋友可以参考下哈,希望对你有所帮助
    2013-05-05
  • javascript 继承实现方法

    javascript 继承实现方法

    javascript的继承机制并不是明确规定的,而是通过模仿实现的,意味着继承不是由解释程序处理,开发者有权决定最适合的继承方式.
    2009-08-08
  • 求数组最大最小值方法适用于任何数组

    求数组最大最小值方法适用于任何数组

    之前虽然介绍过一种求数组最大最小值的方法,但那个方法只是用于数组中都是数字的,下面为大家介绍个方法适用于任何数组,有此需求的朋友可以参考下
    2013-08-08
  • JS堆栈内存的运行机制详解

    JS堆栈内存的运行机制详解

    栈内存主要用于存储各种基本类型的变量,包括Boolean、Number、String、Undefined、Null,以及对象变量的指针(地址值),这篇文章主要介绍了JS堆栈内存的运行机制,需要的朋友可以参考下
    2022-06-06
  • 详解js如何优雅处理后端返回的单元格数据

    详解js如何优雅处理后端返回的单元格数据

    这篇文章主要为大家详细介绍了JavaScript如何优雅处理后端返回的单元格数据,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下
    2023-10-10

最新评论