download:玩转自动化运维全流程
一道题目
看到一个很有趣的题目:实现一个方法,支持链式调用。
lazyman.lazy('Lisa').sleep(3).sleepFirst(4).eat('lunch');
// 4s后输出:Sleep Afater 4
// 输出:I'm Lisa
// 3s后输出:Sleep After 3
// 输出:I'm eat lunch
解法
话不多说,直接上代码:
class LazyMan {
callbacks = [];
constructor() {
this.next();
}next() {
setTimeout(() => {
const firstFn = this.callbacks.shift();
firstFn && firstFn();
}, 0);
}lazy(name) {
this.callbacks.push(() => {
console.log(`Hi, I'm ${name}`);
this.next();
});
return this;
}sleep(time) {
this.callbacks.push(() => {
setTimeout(() => {
console.log(`Sleep after ${time}`);
this.next();
}, time * 1000);
});
return this;
}sleepFirst(time) {
this.callbacks.unshift(() => {
setTimeout(() => {
console.log(`Sleep after ${time}`);
this.next();
}, time * 1000);
});
return this;
}eat(item) {
this.callbacks.push(() => {
console.log(`I am eat ${item}`);
this.next();
});
return this;
}
}const lazyman = new LazyMan();
lazyman.lazy('Lisa').sleep(3).sleepFirst(4).eat('lunch');
题解分析
这个题目,首先要知道如何完成链式调用,就是设置一个类,类中声明的方法的结尾最后都会重新返回该类实例的引用,这样就能够链式调用了。
所以我们创建一个
LazyMan的类。
【玩转自动化运维全流程吾爱无密fen】接下来是如何保证顺序执行,那就是使用一个回调数组,每个函数调用后会检查一次回调是否为空,如果不为空,则继续执行。
同时为了保证第一次执行前,会先进行一遍所有函数的遍历,确认优先级,我们在
constructor
里面使用setTimeout
进行创建一个微任务,这样会等main函数里的宏任务全部执行完,才会开始真正的函数执行。推荐阅读
- java|《Spring Boot 实战》随记
- Linux操作系统的学习|Linux 终端修改分辨率
- Linux操作系统的学习|Linux系统查看文件目录路径和切换目录命令大全
- Linux操作系统的学习|Ubuntu快速入门笔记
- GBASE培训|认证培训 | GBase 8s 11月培训训练营圆满结束
- 什么是FAQ(怎么编写FAQ文档?)
- 虚拟化技术(aliyun)
- 极客日报|B站回应“让用户卖隐私换会员”质疑;UI设计软件Figma封停大疆等公司账号;Arch Linux 诞生二十年|极客头条
- 运维|拥有自己的私有云盘-使用Docker安装nextcloud云盘