一道關於Promise應用的面試題

發表於2016-05-17
題目:紅燈三秒亮一次,綠燈一秒亮一次,黃燈2秒亮一次;如何讓三個燈不斷交替重複亮燈?(用Promse實現)三個亮燈函式已經存在:

這道題首先考察Promise的應用,Promise的詳細說明請看我的這篇文章:閒話Promise機制。首先我們需要一個函式來實現時間控制:

如果把問題簡化一下,如果只需要一個週期,那麼利用Promise應該這樣寫:

現在一個週期已經有了,剩下的問題是如何讓他無限迴圈。說道迴圈很容易想到for while do-while這三個,比如:

如果你是這樣想的,那麼恭喜你成功踩了坑!這道題的第二個考查點就是setTimeout相關的非同步佇列會掛起知道主程式空閒。如果使用while無限迴圈,主程式永遠不會空閒,setTimeout的函式永遠不會執行!

正確的解決方法就是這道題的第三個考查點——遞迴!!!解決方案如下:

整體程式碼如下:

同時可以看到雖然Promise可以用來解決回撥地獄問題,但是仍然不可避免的會有回撥出現,更好的解決方案是利用Generator來減少回撥:

相關文章