如何用js实现一个红绿灯

4,478 阅读2分钟

昨天看winter老师开的一门课,重学前端,感觉很棒,在最新一节课(异步相关)的末尾有个课后题,如何用js实现一个红绿灯。那我们如何实现呢。

首先第一步:分析需求

一个红绿灯,有哪些功能呢:红灯绿灯黄灯依次切换,并且一直循环。

看功能很简单

第二步: 设计实现方案

写一个定时任务,一直循环

第三步: 代码实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #ss{
            width: 100px;
            height: 100px;
            border-radius: 50px;
        }
        #sss{
            width: 100px;
            height: 100px;
            border-radius: 50px;
        }
        #ssss{
            width: 100px;
            height: 100px;
            border-radius: 50px;
        }
        .s {
            width: 400px;
            height: 140px;
            border: 1px solid #666;
            border-radius: 20px;
            background: #f7f7f7;
            display: flex;
            justify-content: space-around;
            align-items: center;
        }
    </style>
</head>
<body>
<div class="s">
<div id="ss">
</div>
    <div id="sss">
    </div>
    <div id="ssss">
    </div>
</div>
</body>
<script>
   window.onload = () => {
       let bg1 = document.getElementById('ss')
       let bg2= document.getElementById('sss')
       let bg3 = document.getElementById('ssss')
       let setColor = (color, duration, num) => {
           return new Promise((res,rej) => {
               colors(num, color)
               setTimeout(res, duration)
           })
       }
       let colors = (num, color) => {
           if(num === 1) {
               bg1.style.background = color
               bg2.style.background = '#E2DCDC'
               bg3.style.background = '#E2DCDC'
           }
           if(num === 2) {
               bg2.style.background = color
               bg1.style.background = '#E2DCDC'
               bg3.style.background = '#E2DCDC'
           }
           if(num === 3) {
               bg3.style.background = color
               bg2.style.background = '#E2DCDC'
               bg1.style.background = '#E2DCDC'
           }
       }
       async function sett() {
            await setColor('green', 6000, 1)
           await setColor('yellow', 2000, 2)
           await setColor('red', 4000, 3)
           await sett()
       }
       sett()
   }
</script>
</html>

核心代码:

let setColor = (color, duration, num) => {
           return new Promise((res,rej) => {
               colors(num, color)
               setTimeout(res, duration)
           })
       }
async function sett() {
            await setColor('green', 6000, 1)
           await setColor('yellow', 2000, 2)
           await setColor('red', 4000, 3)
           await sett()
       }
     

写一个异步任务,返回promise,其中写一个settimeout方法,让当前灯一直留存

sett方法依次调用红绿灯的顺序,以及显示时间。 用await阻塞当前异步任务,最后调用自身,保证循环调用。