牛客网看到的一道腾讯实习笔试题
实现 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的理解吧
但是rest
和restFirst
如果多次调用就不知道了 要求里没有体现
刚写完,发现楼上已经发出答案了。比自己写的简单多了。就不贴代码了。向楼上学习。
@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);