You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
classLazyMan{constructor(name){this.name=name;// 为什么要加 setTimeout({}, 0), 保证每轮的微任务执行后才执行,为了实现 sleepFirst 之后才执行这部分setTimeout(()=>{console.log(`Hi! This is ${name}!`);},0);}eat(value){// 为什么要加 setTimeout({}, 0), 保证每轮的微任务执行后才执行,为了实现 sleepFirst 之后才执行这部分setTimeout(()=>{console.log(`eat ${value}`);},0);// 返回 this 实现链式调用returnthis;}sleep(ms){constdelay=ms*1000;consttime=Date.now();while(Date.now()-time<delay){}// 为什么在setTimeout里返回this不行, 函数执行会先于setTimeout里面的函数执行setTimeout(()=>{console.log(' sleep wake up after '+ms);},0);returnthis;}sleepFirst(ms){newPromise((resolve,reject)=>{constdelay=ms*1000;consttime=Date.now();while(Date.now()-time<delay){}resolve();}).then(()=>{console.log('sleepFirst wake up after '+ms);});returnthis;}}functionlazyMan(name){returnnewLazyMan(name);}
class_LazyMan{constructor(name){this.taskQueue=[];this.name=name;this.timer=null;this.sayHi();}// 每次调用时清楚timer,上一次设置的执行taskQueue就不会运行。// 重新设置timer,会在下一次调用完后进入执行。// 当所有调用结束后,就会顺利执行taskQueue队列里的事件next(){clearTimeout(this.timer);this.timer=setTimeout(async()=>{// 执行taskQueue队列里的事件for(leti=0;i<this.taskQueue.length;i++){awaitthis.taskQueue[i]();}});returnthis;}sayHi(){this.taskQueue.push(()=>{console.log('Hi! This is '+this.name);});returnthis.next();}eat(str){this.taskQueue.push(()=>{console.log('Eat '+str);});returnthis.next();}beforSleep(time){// unshift插入到事件的第一个this.taskQueue.unshift(()=>this.sleepPromise(time));returnthis.next();}sleep(time){this.taskQueue.push(()=>this.sleepPromise(time));returnthis.next();}// sleep的Promise对象,用于给async/await来阻塞后续代码执行sleepPromise(time){returnnewPromise((resolve,reject)=>{setTimeout(()=>{console.log('wake up after '+time);resolve();},time*1000);});}}functionLazyMan(name){returnnew_LazyMan(name);}
题目
实现方法一:
为了 保证每轮的微任务执行后才执行,为了实现 sleepFirst 之后才执行这部分的逻辑
这种情况会出现的问题是,函数已经执行完了,才执行到 setTimeout。输出值如下
实现方法二
考察知识点:闭包,事件轮询机制,链式调用,队列
参考
The text was updated successfully, but these errors were encountered: