下面來看一道比較典型的問題,通過這個問題來對比幾種異步編程方法:紅燈 3s 亮一次,綠燈 1s 亮一次,黃燈 2s 亮一次;如何讓三個燈不斷交替重復亮燈?
三個亮燈函數:
這道題復雜的地方在于需要“交替重復”亮燈,而不是“亮完一次”就結束了。
(1)用 callback 實現
這里存在一個 bug:代碼只是完成了一次流程,執行后紅黃綠燈分別只亮一次。該如何讓它交替重復進行呢?
上面提到過遞歸,可以遞歸亮燈的一個周期:
注意看黃燈亮的回調里又再次調用了 step 方法 以完成循環亮燈。
(2)用 promise 實現
這里將回調移除,在一次亮燈結束后,resolve 當前 promise,并依然使用遞歸進行。
(3)用 async/await 實現