JavaScript:实现一个懒人LazyMan

Javascript:实现LazyMan

需求

LazyMan(“Jane”)输出:
Hi! This is Jane!
    
LazyMan(“Jane”).sleep(20).eat(“dinner”)输出
Hi! This is Jane!
//等待20秒..
Wake up after 20
Eat dinner~
    
LazyMan(“Jane”).eat(“dinner”).eat(“supper”)输出
Hi This is Jane!
Eat dinner~
Eat supper~
    
LazyMan(“Jane”).sleepFirst(5).eat(“supper”)输出
//等待5秒
Wake up after 5
Hi This is Jane!
Eat supper~

代码实现

function Lazyman(name){
    
    
    return new _lazyman(name);
}

function _lazyman(name){
    
    
	//创建任务队列
    this.task = [];
    //保存指向lazyman的this,以供给闭包使用
    let _this = this;
    //默认问好
    let fn = (function(name){
    
    
        return ()=>{
    
    
            console.log(`Hi! This is${
      
      name}`);
            //完成任务后执行下一个任务
            _this.next();
        }
    })(name);
	//将此任务存入任务队列
    this.task.push(fn);
    //启动第一个任务
    setTimeout(()=>{
    
    
        this.next();
    },0);
}

_lazyman.prototype = {
    
    
	//拿出队列中的第一个任务并执行
    next : function(){
    
    
        let fn = this.task.shift();
        fn && fn();
    },
    eat : function(food){
    
    
        let fn = (food=>{
    
    
            return ()=>{
    
    
                console.log(`Eat ${
      
      food}~`);
                this.next();
            }
        })(food);
        this.task.push(fn);
        return this;
    },
    sleep : function(time){
    
    
        let fn = (time=>{
    
    
            return ()=>{
    
    
                console.log(`Wake up after ${
      
      time}s`)
                //阻塞下一个任务
                setTimeout(()=>{
    
    
                    this.next();
                },time*1000);
                
            }
        })(time);
        this.task.push(fn);
        return this;
    },
    sleepFirst : function(time){
    
    
        let fn = (time=>{
    
    
            return ()=>{
    
    
                console.log(`wake up after ${
      
      time}s`);
                setTimeout(()=>{
    
    
                    this.next();
                },time*1000);  
            }
        })(time);

        this.task.unshift(fn);
        return this;
    }
}

执行结果

Lazyman('yivi').sleepFirst(3).eat('peach').sleep(2).eat('apple')

wake up after 3s
Hi!This is yivi!
Eat peach~
wake up after 2s
Eat apple~

总结

此题目涉及链式调用、事件循环、闭包、观察者模式,可学习ES6的相关知识后再回看这道题,思路就会清晰很多!

猜你喜欢

转载自blog.csdn.net/yivisir/article/details/107899020