异步流程控制

1

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

1、callback

回调函数的异步方案是我们最熟悉不过的了,ES5中异步API大多采用这种形式,拿ajax举例:
比如我们希望xx2请求发生在xx1的请求完成之后,一般会是如下写法:
image.png
仔细观察不难发现这种实现方式的缺点,实现过程是一层层嵌套,如果有多个异步请求需要执行,那么它的嵌套层次将会很深,造成回调地狱,代码可读性非常差。

2、promise

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

3、generator

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

4、async/await

async/awaites8中引入的一种处理异步流程控制的方案,它是generator函数的语法糖,可以使异步操作更加简洁方便。
image.png
async/await相比promise代码更精简清晰,比如多个异步任务执行时,使用promise需要写很多的then调用,且每个then方法中都要用一个function包裹异步任务。而async/await就不会有这个烦恼。此外,在异常处理,异步条件判断方面,async/await都可以节省很多代码。

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

你可能感兴趣的

载入中...