图解 JavaScript——代码实现(六种异步方案, 重点是 Promise、Async、发布 / 订阅原理实现,真香)
关注公众号“执鸢者”,回复“书籍”获取大量前端学习资料,回复“前端视频”获取大量前端教学视频,回复“异步”获取本节整体思维导图。
本节主要阐述六种异步方案:回调函数、事件监听、发布/订阅、Promise、Generator和Async。其中重点是发布/订阅、Promise、Async的原理实现,通过对这几点的了解,希望我们前端切图仔能够在修炼内功的路上更进一步。
一、六种异步方案
1.1 回调函数
异步编程的最基本方法,把任务的第二段单独写在一个函数里面,等到重新执行这个任务的时候,就直接调用这个函数。
优点:简单、容易理解和实现。
缺点:多次调用会使代码结构混乱,形成回调地狱。
1.2 事件监听
异步任务的执行不取决于代码的执行顺序,而取决于某个事件是否发生。
优点:易于理解,此外对于每个事件可以指定多个回调函数,而且可以“去耦合”,有利于实现模块化。
缺点:整个程序都要变成事件驱动型,运行流程会变得很不清晰。
1.3 发布/订阅
发布/订阅模式在观察者模式的基础上,在目标和观察者之间增加一个调度中心。订阅者(观察者)把自己想要订阅的事件注册到调度中心,当该事件触发的时候,发布者(目标)发布该事件到调度中心,由调度中心统一调度订阅者注册到调度中心的处理代码。
1.4 Promise
Promise 是异步编程的一种解决方案,是为解决回调函数地狱这个问题而提出的,它不是新的语法功能,而是一种新的写法,允许将回调函数的嵌套改为链式调用。
优点:将回调函数的嵌套改为了链式调用;使用then方法以后,异步任务的两端执行看的更加清楚。
缺点:Promise 的最大问题是代码冗余,原来的任务被 Promise 包装了一下,不管什么操作,一眼看去都是一堆then,原来的语义变得很不清楚。
1.5 Generator
Generator 函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同。其最大特点是可以控制函数的执行。
优点:异步操作表示的很简洁,此外可以控制函数的执行。
缺点:流程管理不方便,不能实现自动化的流程管理。
1.6 Async
ES2017 标准引入了async函数,使得异步操作变得更加方便。简言之,该函数就是Generator函数的语法糖。
优点:内置执行器,可以自动执行;语义相比Generator更加清晰;返回值是Promise,比Generator函数的返回值是Iterator对象操作更加方便。
增加学习成本。
二、Promise原理实现
>不管是实际开发中还是面试过程中,各位老铁们对Promise肯定不会陌生,下面就让我们一起来唠一唠Promsie的实现原理,根据PromiseA+规范来进行实现,然后对其相关的静态方法(Promise.resolve()、Promise.reject()、Promise.all()、Promise.race())和实例方法(Promise.prototype.catch()、Promise.prototype.finally())进行实现。
2.1 思考一下
首先用一幅图来展示一下我考虑实现这个函数的思路吧。
2.2 根据Promise/A+规范实现Promise
人家有相关标准,我们就要遵守,毕竟遵纪守法才是好公民,现在只能硬着头皮把这个标准过一遍。
下面就是基于Promise/A+规范实现的代码,已经经过promises-aplus-tests库进行了验证。
2.2 其他方法
按照Promise/A+规范实现了Promise的核心内容,但是其只实现了Promise.prototype.then()方法,那其它方法呢?下面我们就唠一唠其它方法,包括静态方法(Promise.resolve()、Promise.reject()、Promise.all()、Promise.race())和实例方法(Promise.prototype.catch()、Promise.prototype.finally())。
2.2.1 Promise.resolve()
2.2.2 Promise.reject()
2.2.3 Promise.all()
2.2.4 Promise.race()
2.2.5 Promise.catch()
2.2.6 Promise.finally()
三、Async原理实现
在开发过程中常用的另一种异步方案莫过于Async,通过async函数的引入使得异步操作变得更加方便。实质上,async是Generator的语法糖,最大的亮点是async内置执行器,调用后即可自动执行,不像Generator需要调用next()方法才能执行。
这是Async的实现原理,即将Generator函数作为参数放入run函数中,最终实现自动执行并返回Promise对象。
四、发布/订阅实现
更加详细内容可以参考《图解23种设计模式》
发布/订阅模式在观察者模式的基础上,在目标和观察者之间增加一个调度中心。订阅者(观察者)把自己想要订阅的事件注册到调度中心,当该事件触发的时候,发布者(目标)发布该事件到调度中心,由调度中心统一调度订阅者注册到调度中心的处理代码。
相关章节<br/>
参考链接
欢迎大家关注公众号(回复“异步”获取本节的思维导图,回复“书籍”获取大量前端学习资料,回复“前端视频”获取大量前端教学视频)
版权声明: 本文为 InfoQ 作者【执鸢者】的原创文章。
原文链接:【http://xie.infoq.cn/article/578257b224a24300c6e0b025b】。文章转载请联系作者。
评论