实现红绿灯循环输出


实现一个红绿灯转换函数,循环亮灯。

Promise 的实现

使用 Promise 将异步行为封装起来,待异步行为完成后 resolve。

const traffic_light = (color, delay) => {
        return new Promise((resolve, reject) => {
          console.log(`现在是${color}灯`)
          setTimeout(() => {
            resolve()
          }, delay)
        })
      }
      const main = () => {
        Promise.resolve()
          .then(() => {
            return traffic_light('红', 3000)
          })
          .then(() => {
            return traffic_light('黄', 1000)
          })
          .then(() => {
            return traffic_light('绿', 2000)
          })
          .then(() => {
            main()
          })
      }
      main()

Promise和async/await 的实现

 function timer(current, delay, next) {
        return new Promise((resolve) => {
          console.log(`当前是${current}灯,${delay}秒后变成${next}灯`)
          setTimeout(() => {
            resolve()
          }, delay * 1000)
        })
      }

      async function lingt() {
        await timer('红', 3, '绿')
        await timer('绿', 5, '黄')
        await timer('黄', 2, '红')
        await lingt()
      }
      lingt()

Html和css实现

 <!--warp标签是后面的蓝色背景-->
    <div class="wrap">
      <div class="traffic-light"></div>
    </div>
<style>
    body {
      margin: 0;
      /* 绝对定位使height: 100%生效 */
      position: absolute;
      height: 100%;
      width: 100%;
    }
    /* 背景图 使用margin auto实现垂直水平居中 */
    .wrap {
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      margin: auto;
      width: 500px;
      height: 350px;
      border-radius: 10px;
      background: rgb(97, 170, 189);
    }
    /* 灯框架 */
    .traffic-light {
      /* 居中代码 */
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      margin: auto;
      text-align: center;

      /* 绘制图案 */
      width: 300px;
      height: 90px;
      background: #282f2f;
      border-radius: 50px;
      box-shadow: 0 0 0 2px #eee inset;
    }
    .traffic-light::after {
      /* 居中代码 */
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);

      content: '';
      display: inline-block;
      width: 70px;
      height: 70px;
      border-radius: 50%;

      animation: traffic-light 5s linear 0s infinite;
    }

    @keyframes traffic-light {
      from {
        background: transparent; /* 黄灯 */

        box-shadow: -85px 0 0 0 transparent, /* 红灯 */ 85px 0 0 0 transparent,
          /* 绿灯 */ -85px 0 15px 0 transparent,
          /* 红灯光影 */ 0px 0 15px 0 transparent,
          /* 黄灯光影 */ 85px 0 15px 0 transparent; /* 绿灯光影 */
      }
      25% {
        background: transparent; /* 黄灯 */

        box-shadow: -85px 0 0 0 rgb(247, 78, 26),
          /* 红灯 */ 85px 0 0 0 transparent,
          /* 绿灯 */ -85px 0 15px 0 rgb(247, 78, 26),
          /* 红灯光影 */ 0px 0 15px 0 transparent,
          /* 黄灯光影 */ 85px 0 15px 0 transparent; /* 绿灯光影 */
      }
      50% {
        background: rgb(231, 183, 78); /* 黄灯 */

        box-shadow: -85px 0 0 0 transparent, /* 红灯 */ 85px 0 0 0 transparent,
          /* 绿灯 */ -85px 0 15px 0 transparent,
          /* 红灯光影 */ 0px 0 15px 0 rgb(231, 183, 78),
          /* 黄灯光影 */ 85px 0 15px 0 transparent; /* 绿灯光影 */
      }
      75% {
        background: transparent; /* 黄灯 */

        box-shadow: -85px 0 0 0 transparent,
          /* 红灯 */ 85px 0 0 0 rgb(38, 175, 84),
          /* 绿灯 */ -85px 0 15px 0 transparent,
          /* 红灯光影 */ 0px 0 15px 0 transparent,
          /* 黄灯光影 */ 85px 0 15px 0 rgb(38, 175, 84); /* 绿灯光影 */
      }
      to {
        background: transparent; /* 黄灯 */

        box-shadow: -85px 0 0 0 transparent, /* 红灯 */ 85px 0 0 0 transparent,
          /* 绿灯 */ -85px 0 15px 0 transparent,
          /* 红灯光影 */ 0px 0 15px 0 transparent,
          /* 黄灯光影 */ 85px 0 15px 0 transparent; /* 绿灯光影 */
      }
    }
  </style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以给您讲解一下如何使用 Promise 实现红绿灯的控制。 首先,我们可以定义一个 `trafficLight` 函数,该函数接受一个时间参数,表示红绿灯持续的时间。在 `trafficLight` 函数内部,我们可以使用 Promise 来实现红绿灯的控制。 具体的实现思路如下: 1. 使用 `Promise.resolve()` 来返回一个初始的 Promise 对象。 2. 在 Promise 对象中使用 `setTimeout()` 来控制红绿灯的变化。当红绿灯为红灯时,我们可以使用 `resolve()` 方法来切换到下一个状态;当红绿灯为绿灯时,我们可以使用 `reject()` 方法来切换到下一个状态。 3. 在 Promise 对象中使用 `then()` 方法来处理状态变化后的逻辑。当红绿灯变为绿灯时,我们可以输出 "绿灯亮起来了!";当红绿灯变为红灯时,我们可以输出 "红灯亮起来了!"。 4. 在 `trafficLight` 函数内部,我们可以使用一个循环来不断切换红绿灯的状态,直到指定的时间结束。 下面是一个示例代码: ```javascript function trafficLight(time) { let promise = Promise.resolve(); const loop = () => { promise = promise.then(() => new Promise((resolve, reject) => { console.log('红灯亮起来了!'); setTimeout(() => { console.log('绿灯亮起来了!'); reject(); }, time); })).catch(() => new Promise((resolve, reject) => { console.log('绿灯亮起来了!'); setTimeout(() => { console.log('红灯亮起来了!'); resolve(); }, time); })).then(loop); }; loop(); } trafficLight(2000); // 控制红绿灯持续时间为 2 秒 ``` 上面的代码中,我们使用了一个 `loop` 函数来不断切换红绿灯的状态。在 `loop` 函数内部,我们首先通过 `promise.then()` 方法来处理当前状态的变化,然后通过 `.catch()` 方法来处理下一个状态的变化。这样,我们就可以通过一个循环来不断控制红绿灯的变化了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值