利用promise写红绿灯

promise是什么?

Promise 是异步编程的一种解决方案,其实是一个构造函数,自己身上有all、reject、resolve这几个方法,原型上有then、catch等方法。

红绿灯的效果就是使用promise的原型的then方法,再加上闭包

红绿灯的效果是: 红灯3秒,黄灯1秒,绿灯2秒

1、首先是html代码

<div id="bigbox">
			<div class="box" id="redbox"></div>
			<div class="box" id="yellowbox"></div>
			<div class="box" id="greenbox"></div>
</div>

2、 css代码

#bigbox{
	width: 200px;
	height: auto;
	background: black;
	border-radius: 20px;
	padding: 10px;
}
.box{
	width: 160px;
	height: 160px;
	margin: 0 auto;
	margin-top: 10px;
	border-radius:50%;
	border: 5px solid gray;
	background: black;
}

3、 js代码

		<script>
		var red=document.getElementById('redbox');
		var yellow=document.getElementById('yellowbox');
		var green=document.getElementById('greenbox');
		
			function changeColor(t){
				return new Promise((resolve,reject)=>{
					setTimeout(resolve,t)
				})
			}
			//利用闭包原理循环红绿灯
			;(function change(){
				red.style.backgroundColor="red";
				changeColor(3000).then(()=>{
					red.style.backgroundColor="black";
					yellow.style.backgroundColor="yellow";
					return changeColor(1000)
				}).then(()=>{
					yellow.style.backgroundColor="black";
					green.style.backgroundColor="green";
					return changeColor(2000)
				}).then(()=>{
					green.style.backgroundColor="black";
					change()
				})
			})();
			
		</script>

创建一个changeColor方法,返回的是一个promise对象,所以在下面调用changeColor方法是可以用promise的原型方法 then

4、 实现原理

promise对象转化为resolved时,then方法才调用里面的回调函数。

即 changeColor中的定时器在经过规定秒数后,才传递出resolve的状态是否是resolved,then在接收到resolved后才开始执行变色的代码,这样就实现了一个灯亮的时间,有因为then里面return changeColor(1000),所以又是一个新的promise对象了,可以接着使用then方法。

在最后的then中再调用change()方法,就实现了循环。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值