LazyMan-Promise版

最近看到好多面经里都提到了LazyMan
自己用任务栈的方式确实简单解决了,但是突然看到有人被问到用Promise解决,就觉得很有意思了
网上也有人用Promise了,但结果用了栈去存Promise,大哥那还用Promise干什么..?
最后顺便把sleepAtFrist也解决了,可能方法不够完美,但目前自己没测到bug,如果有更好的方法希望有人指点!
关键在弄清宏任务和微任务之间的关系,我觉得这一个案例能讲透了
function LazyMan(name) {
    this.promiseChain = new Promise((resolve) => {
        setTimeout(() => {
            this.atFirst = this.atFirst ? this.atFirst : 0;
            console.log(`Hi, my name is ${name}`);
            resolve()    //因为需要在所有的then在同步代码中绑定好之后才能开始执行,所以放在setTimeOut里
        }, this.atFirst * 1000);
    })
}

LazyMan.prototype.eat = function (food) {    //这里步骤应该没什么太复杂的
    this.promiseChain.then((task) => {
        console.log(`I eat ${food}`);
    })
    return this;
}

LazyMan.prototype.sleep = function (time) {    //关键在sleep上,eat只需要为当前的chain进行then就好,但sleep要保证接下来chain为新promise,同时把自己的resolve交给上一个chain的then里
    var tempP = this.promiseChain;    //临时变量
    this.promiseChain = new Promise((resolve) => {
        tempP.then(() => {
            setTimeout(() => {
                console.log(`I sleep ${time}`);
                resolve();
            }, 1000 * time)
        })
    })
    return this;
}

LazyMan.prototype.sleepAtFirst = function (time) {    //sleepAtFirst应该有更优雅的解决方法吧..我这个实在有点low 但能解决问题
    this.atFirst = time;
    console.log('I sleep at first');
    return this;
}

var lazyman = new LazyMan('jack')
lazyman.sleep(2).eat('meat').sleep(1).eat('apple').sleepAtFirst(1).eat('food')
刚开始的时候我在想用resolve的参数传递任务,最后层层的then进行累积再处理,但后来没继续下去,忘了是啥卡住我了
如果有大佬能指点一下那万分感谢!


#面试题##前端##笔记##面试题目#
全部评论
腾讯这个hardMan函数考了至少六七年了,给大家两种解题满分代码作参考吧:https://mp.weixin.qq.com/s/-hEjxY0yI6ZBTzAlc3xwAw
点赞 回复 分享
发布于 2024-08-23 09:53 广东
主要有两个问题 1. sleep里面promise的传递太复杂了,不用这么写吧 2. sleepfirst耦合太严重了,没有队列方式的清晰。 其实按我的理解,如果有promise相当于把队列的数据结构改成链表。 就必须实现一个尾插和一个头插。尾***这里也做了。 头插因为promise立即执行的机制,必须和尾插错开,用settimeout就可以了。 另外你的sleepfirst多次就不管用了,可以调一下,附上一个我的实现
点赞 回复 分享
发布于 2021-08-05 11:06

相关推荐

家人们,我现在真的好纠结。我是26届的,目前还没有实习过。我现在的情况是,想参加秋招,但是感觉自己的简历特别空,没有实习经历会不会秋招直接凉凉啊?可我又听说现在很多公司对26届实习生也不太感冒,说什么不确定性大。而且我最近在准备考公,时间上也有点冲突。要是把时间花在实习上,备考时间就少了。但要是不实习,又怕以后就业有问题😫有没有懂行的友友帮我分析分析:26届现在不实习,秋招找工作真的会很难吗?考公和实习该怎么平衡啊?如果现在不实习,考完公再去找实习还来得及吗?真的太焦虑了,希望大家能给我点建议🙏
小破站_程序员YT:我可能和大家的观点不一样。人的精力是有限的,不能既要还要。你又想实习又想考公最后又要秋招上岸,我觉得哪有那么多的选择。你如果想考上岸,那就全力以赴。如果想秋招上岸,就继续投实习,投没了,就继续准备秋招,秋招不行继续春招。别到最后,考公没上岸,觉得是花了时间浪费在找实习上了, 秋招没上岸,觉得是浪费时间准备考公去了。我是认为很难说可以去平衡 不喜勿喷,可以叫我删除
点赞 评论 收藏
分享
06-26 15:33
青岛工学院 Java
积极的秋田犬要冲国企:他现在邀请我明天面试
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-26 18:18
点赞 评论 收藏
分享
评论
3
34
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务