如何实现一个 LazyMan?

3月份找实习的时候,微信面试官给了我一套笔试题,今天整理时无意中翻了出来,其中有一道题特别有意思:

实现一个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

以此类推。

这是典型的JavaScript流程控制,问题的关键是如何实现任务的顺序执行。在Express有一个类似的东西叫中间件,这个中间件和我们这里的吃饭、睡觉等任务很类似,每一个中间件执行完成后会调用next()函数,这个函数用来调用下一个中间件。

对于这个问题,我们也可以利用相似的思路来解决,首先创建一个任务队列,然后利用next()函数来控制任务的顺序执行:

打赏支持我写出更多好文章,谢谢!

打赏作者

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

2 11 收藏 9 评论

关于作者:Natumsol

阿里巴巴 前端工程师 个人主页 · 我的文章 · 5 ·    

相关文章

可能感兴趣的话题



直接登录
最新评论
  • 笨鱼 程序猿 2016/12/26

    不错

  • Cc。   2016/12/30

    好像jq的封装思想.感觉好舒服啊~~~~~~~~

  • 可以在_LazyMan函数最前面加上

    这样直接调用_LazyMan(‘Hank’)就不会报错了

  • pennnnn   02/06

     var fn =(function(n){
            var name = n;
            return function(){
                console.log(“Hi! This is “ + name + “!”);
                self.next();
            }
        })(name);
    请问此处为何要这样写呢?下面这样不是也可以吗

    • wx_v7v88sdz   02/15

      确实可以,函数参数是值传递,所以原文fn函数做了太多无用的包裹,封装部分也是没有必要的,在_LazyMan函数最前面添加

      if(!(this instanceof LazyMan)){

      return new _LazyMan(name);

      }

  • CoderLim 前端开发 02/13

    写的很好,我也写了两个demoqueue方式和promise方式,可以参考一下:

  • Samphay 前端开发 05/05

    我试了这种办法,大家有什么想法?

跳到底部
返回顶部