刚刚面了字节跳动, 题目都很(~~~~~~)基础, 但就是答得不好...视频一挂, 诶, 有好想法了 T.T
不行, 我非得把答案贴这儿, 可惜面试官不在我面前, 不然我非得告诉他, 你看, 这解答至少还凑合啊
// 题目是实现下列链式调用
const chain = new Chain()
chain
.eat()
.sleep(1000)
.eat()
.sleep(1000)
.work()
// 我原来用的 promise 把所有方法都包裹起来, 简直丑破天际...
// 下面是新的解答
// 至于里面有些属性是不是要用 private 或者 protected 什么的, 我就懒得细究了
interface EatAction {
name: "eat";
params: [];
}
interface SleepAction {
name: "sleep";
params: [number];
}
interface WorkAction {
name: "work";
params: [];
}
type Action = EatAction | SleepAction | WorkAction
class Chain {
running = false
actions: Action[] = []
trigger() {
if (this.running) { return }
const action = this.actions.shift()
if (!action) { return }
this.running = true
switch (action.name) {
case "eat":
console.log("eat")
this.running = false
this.trigger()
break
case "work":
console.log("work")
this.running = false
this.trigger()
break
case "sleep":
setTimeout(() => {
console.log("sleep")
this.running = false
this.trigger()
}, action.params[0])
break
default:
break
}
}
eat() {
this.actions.push({
name: "eat",
params: [],
})
this.trigger()
return this
}
sleep(n: number) {
this.actions.push({
name: "sleep",
params: [n],
})
this.trigger()
return this
}
work() {
this.actions.push({
name: "work",
params: [],
})
this.trigger()
return this
}
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.