当前位置: 首页 > 编程笔记 >

JavaScript中使用Callback控制流程介绍

邓昀
2023-03-14
本文向大家介绍JavaScript中使用Callback控制流程介绍,包括了JavaScript中使用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)->

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

 类似资料:
  • 目录表 简介 if语句 使用if语句 它如何工作 while语句 使用while语句 for循环 使用for语句 break语句 使用break语句 continue语句 使用continue语句 概括 简介 在到目前为止我们所见到的程序中,总是有一系列的语句,Python忠实地按照它们的顺序执行它们。如果你想要改变语句流的执行顺序,该怎么办呢?例如,你想要让程序做一些决定,根据不同的情况做不同的

  • 本文向大家介绍Erlang中的函数与流程控制介绍,包括了Erlang中的函数与流程控制介绍的使用技巧和注意事项,需要的朋友参考一下 一:函数 1:在Erlang中,【名字相同但参数数目不同】的两个函数是完全不同的函数。 2:其他模块内的函数用完全限定名称 被调用: 3:子句间以分号【;】分隔,在最后的结尾处以【.】结尾。 4:每个函数都由一组子句组成。子句间以分号“;”分隔。每个子句都包含一个子句

  • 任何编程语言都包含的一个必要部分就是改变控制流程:if/else,for等。让我们讲述 Rust 语言中 的这部分内容。

  • 流程控制 和Java、PHP等语言不一样,sh的流程控制不可为空,如: <?php if (isset($_GET["q"])) { search(q); } else { //do nothing } 在sh/bash里可不能这么写,如果else分支没有语句执行,就不要写这个else。 还要注意,sh里的if [ $foo -eq 0 ],这个方括号跟Java/PHP里if后面的

  • 决策结构要求程序员指定程序要评估或测试的一个或多个条件,以及在条件被确定为true要执行的语句,以及可选的,如果条件要执行的其他语句被认定是false 。 以下是大多数编程语言中的典型决策结构的一般性 - Swift 4提供以下类型的决策声明。 单击以下链接以检查其详细信息。 Sr.No 声明和说明 1 if 语句 if语句由一个布尔表达式后跟一个或多个语句组成。 2 if...else 语句 i

  • Swift提供了類似 C 語言的流程控制結構,包括可以多次執行任務的for和while迴圈,基於特定條件選擇執行不同程式碼分支的if和switch語句,還有控制流程程跳轉到其他程式碼的break和continue語句。 除了 C 語言裡面傳統的 for 條件遞增(for-condition-increment)迴圈,Swift 還增加了for-in迴圈,用來更簡單地遍歷陣列(array),字典(d