红灯3秒亮一次,绿灯2秒亮一次,黄灯1秒亮一次;如何使用Promise让三个灯不断交替重复亮灯?
function red() {
console.log('red');
}
function green() {
console.log('green');
}
function yellow() {
console.log('yellow');
}
/*
控制每盏灯,使其按某节奏闪烁(设置的时间)
命名为 myLight函数,参数为亮灯函数与时间参数
计时部分使用setTimeout实现
*/
let myLight = (timer, cb) => {
return new Promise((resolve) => {
setTimeout(() => {
cb();
resolve();
}, timer);
});
};
/*
1.控制三种灯闪烁的顺序,命名为 myStep 函数。
应该会用到promise,链式调用,对于promise.then() 方法要满足1.期望的参数为函数2.返回的结果是一个promise
每种颜色的灯操作执行完之后,才会将下一次亮灯操作推入微队列
*/
let myStep = () => {
Promise.resolve().then(() => {
return myLight(3000, red);
}).then(() => {
return myLight(2000, green);
}).then(()=>{
return myLight(1000, yellow);
}).then(()=>{
//实现重复闪烁,要实现不断重复,考虑递归
//灯光闪烁一个周期,即 control 函数运行一次之后,让 control 函数递归调用自身即可。
myStep();
})
};
myStep();
实现重复闪烁要实现不断重复,考虑递归
为什么 while 不行
当然,说到无限循环,很容易想到 while 循环等方法。事实上,这种办法行不通。这涉及到 JavaScript 异步运行机制.
1.一次 事件循环 中,同步代码先入 执行栈 执行,异步代码分情况将其任务注册到 任务队列 中。
2.只有执行栈清空,主线程 才会从任务队列中读取任务,使其入栈执行
3.类似 while(true) 这样的代码,会永久占据主线程,使得执行栈永远不清空。
4.所以,任务队列中等待的亮灯任务也就永无出头之日。