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进行累积再处理,但后来没继续下去,忘了是啥卡住我了
如果有大佬能指点一下那万分感谢!


#面试题##前端##笔记##面试题目#
全部评论
主要有两个问题 1. sleep里面promise的传递太复杂了,不用这么写吧 2. sleepfirst耦合太严重了,没有队列方式的清晰。 其实按我的理解,如果有promise相当于把队列的数据结构改成链表。 就必须实现一个尾插和一个头插。尾***这里也做了。 头插因为promise立即执行的机制,必须和尾插错开,用settimeout就可以了。 另外你的sleepfirst多次就不管用了,可以调一下,附上一个我的实现
点赞 回复
分享
发布于 2021-08-05 11:06

相关推荐

头像 头像
04-25 14:33
Java
美团面了大概四十分钟,全程细节拷打,面完汗流浃背,感觉过不了了,看面经吧说说你平时是怎么送餐的?===>直接傻瓜式回答拧车把就走了如果送餐途中下雨了,你会怎么办?===>回答找个地方躲着,然后就问我那订单超时怎么办,答不出来了。。。如果有个地方爆单,同时有多个不同楼层但是是同一栋楼的地方下单,可能是什么情况?===>答不出来,乱蒙了个可能在开派对,有没有大佬知道的如果到了商家,但商家还没把餐备好,你会怎么做?===>直接回答干等着了,然后感觉这样回答不太好,又补了句我可能会催催商家。。。实际送餐过程中有没有考虑过使用多部手机?===>我说配送账号就一个,没必要使用多部手机。面试官好像不太满意送到餐了,但客户一直不来取餐,你会怎么办?阻塞等待吗?===>我说会打电话催促客户,客户一直不来的话就把餐放到地点,然后拍照走人,然后问我这样做有没有考虑过外卖丢失的情况,外卖丢失怎么办,完了,又掉进坑了有没有送错餐的情况?===>我说实际没遇过这种场景,面试官又不太满意了。。。搞不懂,一定要有实际解决过出错的经验吗。。。没出错不是更好吗。。。餐箱满了,但你又接单了,餐箱放不下了,出现了Out Of Box,如何解决?===>我说一般我会每次接单前检查下餐箱容量,有空间才会接新的单,又追问这样会不会影响接单效率,如果被其它骑手抢单了怎么办?完了,又又掉进坑了。。。送餐过程有没有把外卖进行分类?===>我说我一般电动车前后有两个餐箱,前面放带有汤水易撒的,后面放比较干的外卖。总算是能答出一题了看了下我送的最快的一单,问我为什么那一单10s就送达了。===>因为客户就在店里面,当堂点外卖是为了用券。。。我这个订单是不是有点水了,但鼠鼠是真没什么订单拿得出手了做了道算法,一道贪心,给定单子信息,寻找最短配送路线,之前刷过,10分钟a出来了
点赞 评论 收藏
转发
🕒岗位/面试时间前端开发工程师/4.1面试时长:1h30min书接上回 鼠鼠在受到了一万点暴击后隔天又发来了面试邀请👥面试流程算法:1、力扣基本计算器3(没写出来 讲了思路)2、react搜索结果渲染并进行分页处理3、修复计算器代码bug4、根据业务需求对给出程序进行分析(代码风格、可行性、性能、安全等角度)5、赛马问题(25匹马5条赛道,马的速度恒定,不能计时,最快比几次能选出最快的三匹马)项目/八股:6、介绍项目难点和具体怎么解决的7、现在让你去做技术选型你还会用mobx吗?8、你有了解过react相关的底层原理吗?9、为什么react需要可中断渲染?而其他框架不需要呢?10、项目中js和ts哪个用的比较多?11、ts相对比较好用的语法有哪些?12、ts泛型的应用场景?13、简历上写到熟练使用大模型和copilot等智能工具辅助开发,你能举几个比较好用的例子吗?14、讲一下tcp协议如何实现可靠传输?15、你有了解http3有哪些新特性吗?聊天:16、你最近有关注什么前端或者其他方面一些比较新的技术吗?17、假如你到一家公司,你希望一个团队是怎么样的?反问:技术栈:vue react 业务:应用宝的流量场景 部门内部的一些管理系统 toB的开放平台🤔面试感受时隔一周的第四次腾讯一面 一上来先给了一个小时时间写五道题 还是老问题 一看到难一点的算法就会很紧张 没能写出来 后面三道比较简单的场景题过了 但是在给定时间内思维题没能想出最优解 八股的话没问多少 但是一些原理性的问题还是答不太出来 总体面试体验还可以 隔天挂
点赞 评论 收藏
转发
3 31 评论
分享
牛客网
牛客企业服务