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)
来实现循环更直观。