循环打印红黄蓝


前言

一道比较经典的问题,通过这个问题来对比几种异步编程方法:红灯3s亮一次,黄灯2s亮一次,绿灯1s亮一次;如何让三个等不断交替重复亮灯?


一、三个亮灯函数

  function red () {
    console.log('red')
  }
  function yellow () {
    console.log('yellow')
  }
  function green () {
    console.log('green')
  }

二、用callback回调实现

代码如下

  const task = (timer, color, callback) => {
    setTimeout(() => {
      if (color === 'red') {
        red()
      }
      if (color === 'yellow') {
        yellow()
      }
      if (color === 'green') {
        green()
      }
      callback()
    }, timer);
  }
  const step = () => {
    task(3000, 'red', () => {
      task(2000, 'yellow', () => {
        task(1000, 'green', step)
      })
    })
  }
  step()

三、用promise实现

代码如下

  const task = (timer, color) =>
    new Promise((resolve, reject) => {
      setTimeout(() => {
        if (color === 'red') {
          red()
        }
        if (color === 'yellow') {
          yellow()
        }
        if (color === 'green') {
          green()
        }
        resolve()
      }, timer);
    })

  const step = () => {
    task(3000, 'red')
      .then(() => task(2000, 'yellow'))
      .then(() => task(1000, 'green'))
      .then(step)
  }
  step()

四、用async实现

代码如下

  const task = (timer, color) =>
    new Promise((resolve, reject) => {
      setTimeout(() => {
        if (color === 'red') {
          red()
        }
        if (color === 'yellow') {
          yellow()
        }
        if (color === 'green') {
          green()
        }
        resolve()
      }, timer);
    })

  const step = async () => {
    await task(3000, 'red')
    await task(2000, 'yellow')
    await task(1000, 'green')
    step()
  }
  step()

总结

以上就是今天的内容,这个问题主要是考察异步编程的几种方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值