背景
最近遇到个面试题:点亮绿灯3s,然后点亮黄灯1s,然后点亮红灯2s,然后重复循环。估计是考察ES6 Promise相关内容。那如何更好的实现呢?
Promise实现
function red () {
console.log('red')
}
function green () {
console.log('green')
}
function yellow() {
console.log('yellow')
}
function genPromise(func, timeout) {
return () => {
func();
return new Promise((resolve) => setTimeout(resolve, timeout))
}
}
var redPromise = genPromise(red, 2000),
greenPromise = genPromise(green, 3000),
yellowPromise = genPromise(yellow, 1000);
function step() {
greenPromise().then(() => yellowPromise()).then(() => redPromise()).then(() => step())
}
// 启动
step();
改进
step函数的貌似写复杂了,yellowPromise函数本身返回的就是个Promise对象,那给then方法传递的箭头函数冗余了。修改step函数:
function step() {
greenPromise().then(yellowPromise).then(redPromise).then(step)
}
//启动
step();
再改进
使用async/wait改进下step函数:
async function step() {
await greenPromise();
await yellowPromise();
await redPromise();
step();
}
// 启动
step();