红绿灯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