题目重述
实现一个 HardMan:
HardMan(“jack”) 输出:
I am jackHardMan(“jack”).rest(10).learn(“computer”) 输出
I am jack
//等待10秒
Start learning after 10 seconds
Learning computerHardMan(“jack”).restFirst(5).learn(“chinese”) 输出
//等待5秒
Start learning after 5 seconds
I am jack
Learning chinese
方法一、使用 纯Callbacks 调用
主要涉及到的知识点
- 1.使用ES6中的箭头函数可规避this指向的问题,否则需要用bind来绑定
- 2.setTimeout异步事件,会在同步事件执行完后再开始执行
- 3.实现链式调用,函数返回this即可
- 4.队列的使用
- 5.运用了类和面向对象的编程思想
代码展示
1 | class _HardMan { |
方法二、使用 Promise & Queue
主要涉及到的知识点
- 利用了Promise的异步特性
代码展示
1 | class _HardMan { |
使用 Async/Await 对方法二进行优化
首先我们可以简单地优化一下,将重复的代码用wait抽象出来
1 | wait(sec) { |
然后删除掉next方法,tasks队列中使用Async/Await顺序执行取代this.next()
即可
1 | setTimeout(async () => { |
最终代码
1 | class _HardMan { |
题外话 : 浏览器Event Loop
首先区分是同步事件还是异步事件?
如果是异步事件,是宏事件还是微事件?
宏事件:整体代码script,setTimeout,setInterval
微事件:Promise.then,process.nextTick
参考:https://juejin.im/post/59e85eebf265da430d571f89