前端面试题:信号控制灯

题目

使用Vue实现一个信号控制灯控制器,要求:

  1. 默认情况下

    1. 红灯亮20秒,并且最后闪烁5秒
    2. 绿灯亮20秒,并且最后闪烁5秒
    3. 黄灯亮10秒
  2. 灯的个数、颜色、持续时间、闪烁时间、灯光次序都可配置。如:

    [{color:'#fff',duration: 10000,twinkleDuration: 5000}, ...]

分析

可以简单的分成两部来做:

  1. 信号灯
  2. 控制器

信号灯需要做的事情:

  1. 接受颜色
  2. 亮、闪烁
  3. 结束后通知控制器

控制器需要做的事情:

  1. 接收创建信号灯
  2. 接受信号灯的结束通知,并启动下一个信号灯

显然,这是题考察的是JavaScript的异步编程,我们直接开撕。

手撕

初版

function Light(color, duration, twinkleDuration) {
    // 信号灯
    let brightDuration = duration - twinkleDuration;
    function bright() {
   			// 亮
        return new Promise(function (resolve, reject) {
   
            console.log(`${
     color}灯开始亮`)
            setTimeout(resolve, brightDuration);
        })
    }
    function twinkle() {
   	// 闪烁
        return new Promise(function (resolve, reject) {
   
            console.log(`${
     color}灯开始闪烁`)
            setTimeout(resolve, twinkleDuration);
        })
    }
    function start() {
   	// 启动信号灯
        return new Promise(async function (resolve, reject) {
   
            await bright()				// ①
            await twinkle() 			// ②
            console.log(`${
     color}灯灭掉`)
            resolve()
        })
    }
    return {
   
        start
    }
}
function timer() {
    // 计时器,用来测试
    let start = new Date()
    let now = new Date()
    function next() {
   
        now = new 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值