前端近年的兴起,有大部分是因为 NodeJS
的诞生,而 NodeJS
是个适用于 异步IO 密集型的语言,一些基于 NodeJS
的框架,比喻 KOA2、Adonis 就有大量的 async
和 await
语法,async
的函数的返回值就是 Promise
对象,我们可以用 async
和 await
语法,写出优雅的异步代码,来替换难看且难维护的回调函数。
这里我们会渐进式的来创建一个 Promise
的实现,如果,你还不了解 Promise
,赶快移步 Promise 了解学习,当然这个实现会符合 Promise/A+ 规范,JavaScript
中有很多第三方的 Promise
库,bluebird 就是一个第三方 Promise
类库,相比其它第三方类库或标准对象来说,其有以下优点:功能更齐全而不臃肿、浏览器兼容性更好,大家可以了解下。
废话不多说,直接开干。。。 😠
定义 Promise 类型
一个简单 Promise
语法,如下
1 | const promise = new Promise(function(resolve, reject) { |
实现 resolve 和 then
首先我们以上 👆 的语法,自己定义一个 Promise
实例
1 | function Promise(fn) { |
一个简单的实例写好了,然后,来用一下,看看 👀 结果如何
1 | const p = new Promise(function(resolve){ |
执行结果是:callback is not a function
修改 callback 为异步
这里就遇到一个问题:
发现 resolve()
在 then()
之前调用,在 resolve()
被调用的时候, callback
还是 null
,我们的代码是同步的,而不是异步的。
如是,想办法解决掉这个问题,就是利用 setTimeout
, 把 callback
加入异步队列
代码如下 👇
1 | function Promise(fn) { |
然后,再来用一下,看看 👀 结果如何
1 | const p = new Promise(function(resolve){ |
执行结果是:66