红绿灯Promise问题

题目

题目:红灯三秒亮一次,绿灯一秒亮一次,黄灯2秒亮一次;如何让三个灯不断交替重复亮灯?(用 Promse 实现)

三个亮灯函数已经存在:

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

思路

  1. 时间差异是由于 setTimeout 不同时间 resolve Promise

  2. 不端交替是使用了递归调用(第一次没有做出来)

实现

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

const run = () => 
    Promise.resolve()
      .then(()=>wrap(red, 5)) // 易错
      .then(()=>wrap(green, 2))
      .then(()=>wrap(yellow,1))
      .then(()=>run())


function wrap(fn, time) {
  return new Promise((resolve, reject) =>{
    setTimeout(
    () => {
      fn()
      resolve()
    }, time*1000)
  })
}

run()

// 易错点 注意 wrap不可以被{}包括。没有{}表示有return
// 这样可以等待内部的setTimeout的resolve才会return resolve到下一个then

最后更新于