实现红绿灯代码,及那些骚操作!

228 阅读2分钟

实现红绿灯代码,红灯2秒,黄灯1秒,绿灯3秒,循环改变颜色.

无聊刷沸点看到这样一条沸点

屏幕截图 2022-11-18 145048.png

顿时曾经的面试场景浮现脑海,想必很多人也过这样的手写面试题。曾经面试某公司,让我用react手写这样的效果,脑海中思路也涌现了出来

不就是微任务、宏任务、同步异步去实现么

大概思路知道了,如何写也大概有想法了,然后果断打开Google搜索。果然写法都大差不差人家想法更齐全。

1.使用微任务、宏任务实现

  • setTimeout递归实现
 function changeColor(color) {
   console.log('traffic-light ', color);
 }
 function main() {
   changeColor('red');
   setTimeout(()=>{
     changeColor('yellow');
     setTimeout(() => {
       changeColor('green');
       setTimeout(main, 2000);
     }, 1000);
   }, 2000);
 }
 main();
  • promise递归实现
 function sleep(duration){
     return new Promise(resolve => {
         setTimeout(resolve, duration);
     })
 }
 function changeColor(duration,color){
     return new Promise(resolve => {
     console.log('traffic-light ', color);
       sleep(duration).then(resolve);
   })
 }
 function main() {
   return new Promise(resolve => {
     changeColor(2000, 'red').then(() => {
       changeColor(1000, 'yellow').then(() => {
         changeColor(3000, 'green').then(() => {
           main();
         })
       })
     })
   })
 }
 main();
  • async await 实现
 function sleep(duration) {
   return new Promise(resolve => {
     setTimeout(resolve, duration);
   })
 }
 async function changeColor(color, duration) {
   console.log('traffic-light ', color);
   await sleep(duration);
 }
 async function main() {
   while (true) {
     await changeColor('red', 2000);
     await changeColor('yellow', 1000);
     await changeColor('green', 3000);
   }
 }
 main();
 此时我也看到作者和这个博主代码async await代码一样,看到大家都是优秀的coder!

就是这几个方法,想必正常来说大家想到的都是这样的方法,当我自认为对这道题认知差不多的时候,再次看评论区时,我为我的鲁莽抱歉。大神的[^骚操作]总是让人眼前一亮。

只见大神_大海gwhai,为你一千万遍_给出了css动画

2.animation动画实现

  #myDIV
  {
  width:200px;
  height:200px;
  background:red;
  border-radius:50%;
  animation:myAnimation 6s infinite;
  }

  @keyframes myAnimation
  {
    0%{background-color:green;}
    49.99999%{background-color:green;}
    50% {background-color:yellow;}
    66.66667% {background-color:yellow;}
    66.66668% {background-color:red;}
  }

此时此刻我只想用一张图片来形容

006BkP2Hly1fegrzwwez2j306404tjrp.jpg

这真不乏是一个好方法,果然高手在评论区。

3.数组循环

我第一想法是通过异步方法实现,看了评论区后想可不可以不用异步呢?看一下题,想了想,写下了几行代码

let dom = document.querySelector("#app");
let color = ['green','green','green','yellow','red','red'];
let i = 0;
function change(i){
    dom.style.background = `${color[i]}`
}
setInterval(function(){
  if(color[i-1]!=color[i]){
    change(i)
  }
  i = (i == color.length-1 ? 0 : i+=1)
},1000)

虽说实现了,但是也存在问题,这里直接引用作者的话

这题要考的内容是宏任务和微任务的机制,你对比一下我的代码和你的代码,那边代码可读性更好,你这个代码可读性较差。如果我题目有改动成253253循环,这种你怎么判断

就这样完成了一次有效的摸鱼,也学会了大神的骚操作!技术指数一般,简单记录下!

这里引用了原文链接 blog.csdn.net/latency_che…