实现函数LazyMan,使得:
LazyMan('Hank'); 输出
Hi Hank!
LazyMan('Hank').eat('dinner');输出
Hi Hank!
Eat dinner!
LazyMan('Hank').sleep(5).eat('dinner'); 输出:
Hi Hank!
//等待五秒
Eat dinner!
LazyMan('Hank').sleepFirst(5).eat('dinner');输出:
//等待五秒
Hi Hank!
Eat dinner!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
2017-3-22 代码再次更新,受一道面试题的启发。重新优化了代码(不等待时,setTimeout的间隔时间为0):
得到启发的代码如下:
以下是原答案:
重新来答一遍,这次是认真的,使用了任务队列,同样只使用了一个函数,没用使用Promise,没有使用 timer累加的方法,保证最多只有一个计时器在运行,同时能获取任务开始和最终结束时间。
核心部分是一个 setTimeout 和 一个 任务队列(数组)。
因为使用了队列流程,处理完一个再处理下一个,所以支持多次输出,多次等待,而程序不会乱掉。 LazyMan("A").sleepFirst(1).eat("abc").sleep(4).sleep(5).eat("A").eat("B").eat("C")
测试下结果:
正规作答结束,以下是原答案:
民科解法,欢迎来喷。强迫症,没有使用 任务队列,和 @xiaoboost 答案不同的是,不支持 LazyMan('Hank').sleepFirst(2).sleep(3).eat('lunch').sleep(4).eat('dinner'); 这种方式调用。
不在乎中间过程,只在乎结果。
稍后用队列的方法,重写一遍。
这道题有点意思,要完成这个任务有点麻烦,我算是稍微取了点巧吧。
我个人是使用了异步来实现的。
Man类内部维护了一个任务队列,所有的类方法都会直接操作任务队列的顺序。由于类生成时候设定的异步函数必须要等主进程完成之后才会启动,所以它是不会影响到主进程时候的任务队列操作的。
主进程运行结束,类定义时候的
setTimeout进程启动,它会把队列中的所有方法用then串联起来,之后任务队列就会按照顺序依次运行了。当然这还是能随意组合的,比如这样:
代码在这里:
赶项目进度中换换脑子,随手试写。可以添加新方法,可以任意组合。感觉写得一般。
哈哈 自己的答案
我也来写一个
前些天看过这个问题,https://www.madcoder.cn/inter...,我把这个大牛写的答案复制到这里。
有点 Promise 的味道,参考了 pinkie 的实现