前言
昨天晚上在一个技术群里面看到一些小伙伴在讨论这么一道有趣的题目,题目大致意思就是实现一个懒汉,并且提供一系列的行为方法,调用 eat
就打印吃饭信息,调用 sleep
方法则进行延迟传入时间,再进行下一步的操作。
当然,限制条件是不使用 Promise。
实现一个LazyMan,可以按照以下方式调用:
LazyMan(“Hank”)输出:
Hi! This is Hank!
LazyMan(“Hank”).sleep(10).eat(“dinner”)输出
Hi! This is Hank!
//等待10秒..
Wake up after 10
Eat dinner~
LazyMan(“Hank”).eat(“dinner”).eat(“supper”)输出
Hi This is Hank!
Eat dinner~
Eat supper~
LazyMan(“Hank”).sleepFirst(5).eat(“supper”)输出
//等待5秒
Wake up after 5
Hi This is Hank!
Eat supper
以此类推。
题目分析
链式调用
从 LazyMan(“Hank”).sleepFirst(5).eat(“supper”)
可以看出,每一个方法结尾都可以通过 .
来注册或执行下一步,第一直觉就想到了返回 this
。
sleep 延迟
如何通过 sleep
方法延迟后续方法的执行呢?可以使用 setTimeout
。那么问题又来了, setTimeout
能够通知宿主浏览器在一定时间再把我们的方法推进事件队列中,但我们无法阻碍下一步方法的调用。能够这么想,说明我们把链式调用想象为马上执行了。就好像是这样:
// 错误的代码
sleep (timeo