天天看点

一道关于Promise应用的面试题

题目:红灯三秒亮一次,绿灯一秒亮一次,黄灯2秒亮一次;如何让三个灯不断交替重复亮灯?(用promse实现)

三个亮灯函数已经存在:

如果把问题简化一下,如果只需要一个周期,那么利用promise应该这样写:

现在一个周期已经有了,剩下的问题是如何让他无限循环。说道循环很容易想到<code>for</code> <code>while</code> <code>do-while</code>这三个,比如:

如果你是这样想的,那么恭喜你成功踩了坑!这道题的第二个考查点就是settimeout相关的异步队列会挂起知道主进程空闲。如果使用while无限循环,主进程永远不会空闲,settimeout的函数永远不会执行!

正确的解决方法就是这道题的第三个考查点——递归!!!解决方案如下:

整体代码如下:

同时可以看到虽然promise可以用来解决回调地狱问题,但是仍然不可避免的会有回调出现,更好的解决方案是利用<code>generator</code>来减少回调: