牛客网看到的一道腾讯实习笔试题
发布于 7 小时前 作者 Littlesqx 356 次浏览 来自 问答

实现 Hardman 函数

要求:

HardMan("jack") 
// > I am jack

HardMan("jack").rest(10).learn("computer")
// > I am jack
// 等待10秒
// > Start learning after 10 seconds
// > Learning computer

HardMan("jack").restFirst(5).learn("chinese")
// 等待5秒
// > Start learning after 5 seconds
// > I am jack
// > Learning chinese

上文中 [ > … ] 表示打印内容。

挺有意思的,但是解不了,就来问问

6 回复
function HardMan(name) {
  function introduce() {
    console.log(`I am ${name}`)
  }
  let first = 0
  let delay = 0
  let timer = setTimeout(introduce, 0)
  return Object.create({
    rest(time) {
      delay += time * 1000
      return this
    },
    restFirst(time) {
      clearTimeout(timer)
      first += time * 1000
      timer = setTimeout(function () {
        console.log(`Start learning after ${time} seconds`)
        console.log(`I am ${name}`)
      }, first)
      return this
    },
    learn(lessen) {
      setTimeout(function () {
        console.log(`Learning ${lessen}`)
      }, delay + first)
      return this
    }
  })
}

以上代码可以实现当前要求 推测考察的是对eventloop的理解吧 但是restrestFirst如果多次调用就不知道了 要求里没有体现

刚写完,发现楼上已经发出答案了。比自己写的简单多了。就不贴代码了。向楼上学习。

@Zero2key 考什么我就不知道了,不过你的答案能实现要求就是了。我也贴一下找到的另一个答案,可以实现多次 rest

const HardMan = function (name) {

    this.tasks = [
        () => console.log(`I am ${name}`)
    ];

    this.rest = function (time) {
        this.tasks.push(this.sleep(time));
        return this;
    }
    this.restFirst = function (time) {
        this.tasks.unshift(this.sleep(time));
        return this;
    }
    this.learn = function (something) {
        this.tasks.push(() => console.log('Learning ' + something));
        return this;
    }
    this.sleep = function (time) {
        return () => new Promise(resolve => setTimeout(() => {
            resolve(console.log(`Start learning after ${time} second`));
        }, time * 1000));
    }
    this.run = function () {
        setTimeout(async () => {
            for (task of this.tasks) {
                await task();
            }
        }, 0);
        return this;
    }
    return this.run();
}

@hfuuss 也学习一下这个。

function HardMan(name) {
    var tasks = [];
    var after = 0;
    var next = function () {
        if (tasks.length) (tasks.shift())();
    };
    var sleep = function (time) {
        return function () {
            setTimeout(function () {
                after += time;
                console.log(`Start learning after ${after} second`);
                next();
            }, time * 1000);
        };
    };
    var fn = function () { };

    fn.prototype.rest = function (time) {
        tasks.push(sleep(time));
        return this;
    };
    fn.prototype.restFirst = function (time) {
        tasks.unshift(sleep(time));
        return this;
    };
    fn.prototype.learn = function (subject) {
        tasks.push(function () {
            console.log(`Learning ${subject}`);
            after = 0;
            next();
        });
        return this;
    };

    tasks.push(function () {
        console.log(`I am ${name}`);
        after = 0;
        next();
    });

    setTimeout(next, 0);

    return new fn();
}
HardMan("jack").rest(2).learn("chinese").rest(3).learn("computer").restFirst(1);
回到顶部