Promise
实现红绿灯交替重复亮可以使用 Promise 和 setTimeout 配合来完成。以下是具体的实现代码:
实现代码
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函数会依次执行:
- 红灯亮 3 秒。
- 绿灯亮 2 秒。
- 黄灯亮 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)来实现循环更直观。