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