资讯专栏INFORMATION COLUMN

如何实现一个 LazyMan?

frank_fun / 3363人阅读

摘要:实现一个,可以按照以下方式调用输出输出等待秒输出输出等待秒以此类推。这是典型的流程控制,问题的关键是如何实现任务的顺序执行。

    实现一个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()函数来控制任务的顺序执行:

function _LazyMan(name) {
    this.tasks = [];   
    var self = this;
    var fn =(function(n){
        var name = n;
        return function(){
            console.log("Hi! This is " + name + "!");
            self.next();
        }
    })(name);
    this.tasks.push(fn);
    setTimeout(function(){
        self.next();
    }, 0); // 在下一个事件循环启动任务
}
/* 事件调度函数 */
_LazyMan.prototype.next = function() { 
    var fn = this.tasks.shift();
    fn && fn();
}
_LazyMan.prototype.eat = function(name) {
    var self = this;
    var fn =(function(name){
        return function(){
            console.log("Eat " + name + "~");
            self.next()
        }
    })(name);
    this.tasks.push(fn);
    return this; // 实现链式调用
}
_LazyMan.prototype.sleep = function(time) {
    var self = this;
    var fn = (function(time){
        return function() {
            setTimeout(function(){
                console.log("Wake up after " + time + "s!");
                self.next();
            }, time * 1000);
        }
    })(time);
    this.tasks.push(fn);
   return this;
}
_LazyMan.prototype.sleepFirst = function(time) {
    var self = this;
    var fn = (function(time) {
        return function() {
            setTimeout(function() {
                console.log("Wake up after " + time + "s!");
                self.next();
            }, time * 1000);
        }
    })(time);
    this.tasks.unshift(fn);
    return this;
}
/* 封装 */
function LazyMan(name){
    return new _LazyMan(name);
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22429.html

相关文章

  • 如何实现一个 LazyMan?

    摘要:实现一个,可以按照以下方式调用输出输出等待秒输出输出等待秒以此类推。这是典型的流程控制,问题的关键是如何实现任务的顺序执行。 实现一个LazyMan,可以按照以下方式调用: LazyMan(Hank)输出: Hi! This is Hank! LazyMan(Hank).sleep(10).eat(dinner)输出 Hi! This is H...

    diabloneo 评论0 收藏0
  • 如何实现一个 LazyMan?

    摘要:实现一个,可以按照以下方式调用输出输出等待秒输出输出等待秒以此类推。这是典型的流程控制,问题的关键是如何实现任务的顺序执行。 实现一个LazyMan,可以按照以下方式调用: LazyMan(Hank)输出: Hi! This is Hank! LazyMan(Hank).sleep(10).eat(dinner)输出 Hi! This is H...

    tianyu 评论0 收藏0
  • 如何实现一个 LazyMan?

    摘要:实现一个,可以按照以下方式调用输出输出等待秒输出输出等待秒以此类推。这是典型的流程控制,问题的关键是如何实现任务的顺序执行。 实现一个LazyMan,可以按照以下方式调用: LazyMan(Hank)输出: Hi! This is Hank! LazyMan(Hank).sleep(10).eat(dinner)输出 Hi! This is H...

    ernest.wang 评论0 收藏0
  • 面试题 LazyMan 的Rxjs实现方式

    摘要:前言笔者昨天在做某公司的线上笔试题的时候遇到了最后一道关于如何实现的试题,题目如下实现一个,可以按照以下方式调用输出输出等待秒输出输出等待秒以此类推。 前言 笔者昨天在做某公司的线上笔试题的时候遇到了最后一道关于如何实现LazyMan的试题,题目如下 实现一个LazyMan,可以按照以下方式调用:LazyMan(Hank)输出:Hi! This is Hank!LazyMan(Hank...

    Yuqi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<