最近遇到个面试题:点亮绿灯3s,而后点亮黄灯1s,而后点亮红灯2s,而后重复循环。估计是考察ES6 Promise相关内容。那如何更好的实现呢?javascript
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函数:java
function step() { greenPromise().then(yellowPromise).then(redPromise).then(step) } //启动 step();
使用async/wait改进下step函数:面试
async function step() { await greenPromise(); await yellowPromise(); await redPromise(); step(); } // 启动 step();