一道题看到一个很有意思的题:实现一个支持链式调用的方法。lazyman.lazy('Lisa').sleep(3).sleepFirst(4).eat('lunch');//4s后输出:SleepAfter4//输出:I'mLisa//3s后输出:Sleep3//输出:I'meatlunch解决方案就不多说了,直接加代码:classLazyMan{callbacks=[];constructor(){this.next();}next(){setTimeout(()=>{constfirstFn=this.callbacks.shift();firstFn&&firstFn();},0);}lazy(name){this.callbacks.push(()=>{console.log(`嗨,我是${name}`);this.next();});归还这个;}sleep(time){this.callbacks.push(()=>{setTimeout(()=>{console.log(`Sleepafter${time}`);this.next();},time*1000);});归还这个;}sleepFirst(time){this.callbacks.unshift(()=>{setTimeout(()=>{console.log(`Sleepafter${time}`);this.next();},time*1000);});归还这个;}吃(物品){这个。回调。push(()=>{console.log(`我正在吃${item}`);this.next();});归还这个;}}constlazyman=newLazyMan();lazyman.lazy('丽莎').sleep(3).sleepFirst(4).eat('午餐');链式调用就是设置一个类,类中声明的方法结束最后会返回类实例的引用,这样就可以进行链式调用了。所以我们创建了一个LazyMan类。接下来是如何保证顺序执行,即使用一个回调数组,每次函数调用后检查回调是否为空,不为空则继续执行。同时为了保证在第一次执行之前,会先遍历所有的函数,确认优先级。我们在构造函数中使用setTimeout来创建一个微任务,这样直到main函数中的所有宏任务都执行完才会启动。实际的功能执行。所以本题的重点:callbacks:存放函数执行的列表,方便调整执行顺序。class:创建一个类,为每个函数提供一个统一的parent,通过returnthis保证链式调用。next:逐步执行功能。确认顺序后,所有功能将按顺序执行。setTimeout:定时器。创建一个保证在主函数遍历后开始执行的微任务。
