Promise

实现红绿灯交替重复亮可以使用 PromisesetTimeout 配合来完成。以下是具体的实现代码:


实现代码

function light(color, duration) {
  return new Promise((resolve) => {
    console.log(color); // 输出当前亮灯的颜色
    setTimeout(resolve, duration); // 指定时间后执行下一个灯
  });
}

function trafficLight() {
  // 红绿灯的交替逻辑
  light('Red', 3000)   // 红灯亮 3 秒
    .then(() => light('Green', 2000)) // 绿灯亮 2 秒
    .then(() => light('Yellow', 1000)) // 黄灯亮 1 秒
    .then(() => trafficLight()); // 循环调用,重复执行
}

// 启动红绿灯
trafficLight();

运行结果

  • 每次调用 trafficLight 函数会依次执行:
  1. 红灯亮 3 秒。
  2. 绿灯亮 2 秒。
  3. 黄灯亮 1 秒。
  • 循环执行,形成红绿灯交替效果。

代码解析

light 函数

  • 接收颜色和持续时间,返回一个 Promise,在指定时间后调用 resolve
  • setTimeout 用于模拟灯亮的持续时间。

trafficLight 函数

  • 使用 Promise 的链式调用来确保每个灯依次亮起。
  • 在所有灯亮完之后,通过递归调用实现循环。

可选优化:使用 async/await

更现代的实现方式可以通过 async/await 重构:

function light(color, duration) {
  return new Promise((resolve) => {
    console.log(color);
    setTimeout(resolve, duration);
  });
}

async function trafficLight() {
  while (true) {
    await light('Red', 3000);   // 红灯亮 3 秒
    await light('Green', 2000); // 绿灯亮 2 秒
    await light('Yellow', 1000); // 黄灯亮 1 秒
  }
}

// 启动红绿灯
trafficLight();

特点对比

Promise 链式版本

  • 逻辑清晰,易于理解。
  • 缺点是代码嵌套较深,维护性稍弱。

async/await 版本

  • 更加简洁,易于扩展和维护。
  • 使用 while (true) 来实现循环更直观。

苏ICP备2025153828号