promise实现红绿黄三灯交替执行

面试过程中让你实现隔一秒执行红黄绿灯的循环

看到这个问题,你第一反应我猜你可能会选择直接用定时器实现,代码如下:

function red() {
	console.log('red');
}
function green() {
	console.log('green');
}
function yellow() {
	console.log('yellow');
}
function index() {
	setTimeout(function() {
		red();
		setTimeout(function() {
			green();
			setTimeout(function() {
				yellow();
				setTimeout(function() {
					index();
				},0);
			},1000);
		},1000);
	},1000);
}
index();

如果你是一个初学者,你写出这段代码,你可能会觉得你很牛逼,很有成就感,因为功能确实实现了。但当你有点工作经验了你就会发现,卧槽,这代码那个傻逼写的,写的这么挫。确实,这代码耦合性高,改动如果逻辑复杂将会让人非常头疼,代码可读性也非常差,不利于调试,也没有一点函数封装的思想。如果你面试时使用这份答案,面试官肯定会让你优化代码,使用promise如何优化。使用promise你可以写出如下代码:

	// 统一封装一个函数
	function light(fun, timer) {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(fun());
            }, timer);
        });
    }
    // 然后再调用
    function index() {
        light(red, 1000).then((data) => {
            return light(green, 1000);
        }).then((data) => {
            return light(yellow, 1000);
        }).then(() => {
            index();
        });
    }
    

当你实现了这段代码以后,面试官会觉得你还不错,基本的promise还是会使用的,但他可能有会问你,你有了解过async和await吗,能用async 和await实现这个功能吗?如果你不了解generator函数的话你可能就不会了,async和await其实是它的语法糖,await 后面接的是一个promise返回对象,代码如下

	function light(fun, timer) {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(fun());
            }, timer);
        });
    }
	async function index() {
        while(1) {
            await light(red, 1000);
            await light(green, 1000);
            await light(yellow, 1000);
        }
    }
	index();

是不是感觉这段代码比上面的可读性好多了,调试也方便,而且await后面的代码必须等他返回执行promise的resolve()才会继续往下执行,让你的代码看起来像同步执行的。
有兴趣的同学可以关注我一起交流学习,免费给你解答疑问哦。(前提是我能解决的前端问题)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新西伯利亚狼

继承国人白嫖的优良传统不必打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值