9.5.3关于promise的亮灯问题

红灯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.所以,任务队列中等待的亮灯任务也就永无出头之日。

代码写作思路参考

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值