懒人问题:实现一个Lazyman类
类似一个发布订阅,这个题可以有很多种变形 主要思想是链式调用、promise、防抖、构造函数、原型
const halk = new LazyMan(‘halk’);
halk.sleep(1000).eat().sleep(1000).eat().start();
要求输出I am Halk / I am sleeping / I am eating / I am sleeping I am eating
根据输出的形式可以明确是采用链式调用,
链式调用与直接调用的区别是后者每次使用不同方法需要不断生成新对象进行调用,
而链式调用通过对类中的每个方法添加this返回值返回当前调用方法的对象,简化代码,避免重复使用一个对象变量
// class LazyMan{
// constructor(name){
// this.name = name;
// // 需要一个任务队列,收集start全面的函数,在start的时候通过设置一个防抖函数来执行这个队列中的函数
// this.taskQueue = [];
// this.named(name);
// }
// named(name){
// this.taskQueue.push(()=>{
// console.log(`I am ${name}`);
// this.next();
// });
// }
// sleep(delay){
// this.taskQueue.push(()=>{
// // 定时器的回调函数是异步执行的,所以这里要做一下改造
// setTimeout(()=>{
// console.log(`I am sleeping for ${delay} ms`);
// this.next();
// },delay)
// })
// return this;
// }
// eat(){
// this.taskQueue.push(()=>{
// console.log('I am eating');
// this.next();
// })
// return this;
// }
// start(){
// this.taskQueue.shift()();
// }
// next(){
// if(this.taskQueue.length){
// const task = this.taskQueue.shift();
// task();
// }
// }
// }
class LazyMan{
constructor(name){
this.name = name;
// 需要一个任务队列,收集start全面的函数,在start的时候通过设置一个防抖函数来执行这个队列中的函数
this.taskQueue = [];
this.named(name);
// 不调用start 用promise的链式调用
Promise.resolve().then(res=>this.start())
}
named(name)