异步流程控制

46次阅读

共计 1093 个字符,预计需要花费 3 分钟才能阅读完成。

随着 JavaScript 的快速发现,针对异步流程控制的方案也越来越多,现在常见主要有四种方案:

1、callback

回调函数的异步方案是我们最熟悉不过的了,ES5中异步 API 大多采用这种形式,拿 ajax 举例:
比如我们希望 xx2 请求发生在 xx1 的请求完成之后,一般会是如下写法:

仔细观察不难发现这种实现方式的缺点,实现过程是一层层嵌套,如果有多个异步请求需要执行,那么它的嵌套层次将会很深,造成回调地狱,代码可读性非常差。

2、promise

ES6中提出的 promise 语法糖对异步流程控制做了更好的封装,他提供更加优雅的方式来管理异步任务的执行,可以让我们以同步的方式编写异步代码。

3、generator

generator也是 es6 中新增的一种语法糖,它是一种特殊的函数,可以被用来做异步流程管理。

在上述示例中我们定义了 ajaxManage 这个 generator 函数,但是当我们调用该函数时他并没有真正的执行其内部逻辑,而是会返回一个迭代器对象,generator函数的执行与普通函数不同,只有调用迭代器对象的 next 方法时才会去真正执行我们在函数体内编写的业务逻辑,且 next 方法的调用只会执行单个通过 yieldreturn关键字所定义的状态,该方法的返回值是一个含有 value 以及 done 这两个属性的对象,value属性值为当前状态值,done属性值为 false 表示当前不是最终状态。我们可以通过将异步任务定义为多个状态的方式,用 generator 函数的迭代器机制去管理这些异步任务的执行。这种方式虽然也是一种异步流程控制的解决方案,但是其缺陷在于我们需要手动管理 generator 函数的迭代器执行,如果我们需要控制的异步任务数量众多,那么我们就需要多次调用 next 方法,这显然也是一种不太好的开发体验。

4、async/await

async/awaites8 中引入的一种处理异步流程控制的方案,它是 generator 函数的语法糖,可以使异步操作更加简洁方便。

async/await相比 promise 代码更精简清晰,比如多个异步任务执行时,使用 promise 需要写很多的 then 调用,且每个 then 方法中都要用一个 function 包裹异步任务。而 async/await 就不会有这个烦恼。此外,在异常处理,异步条件判断方面,async/await都可以节省很多代码。

参考文章:
https://juejin.im/post/5a2e21486fb9a0450407d370#heading-4
https://juejin.im/entry/58a11f61128fe1005823a257

正文完
 0