一道关于Promise应用的面试题
2018-03-12 10:29
573 查看
原文链接:http://www.cnblogs.com/dojo-lzz/p/5495671.html
题目:红灯三秒亮一次,绿灯一秒亮一次,黄灯2秒亮一次;如何让三个灯不断交替重复亮灯?(用Promse实现)三个亮灯函数已经存在:
题目:红灯三秒亮一次,绿灯一秒亮一次,黄灯2秒亮一次;如何让三个灯不断交替重复亮灯?(用Promse实现)三个亮灯函数已经存在:
function red(){ console.log('red'); } function green(){ console.log('green'); } function yellow(){ console.log('yellow'); }这道题首先考察Promise的应用,Promise的详细说明请看我的这篇文章:闲话Promise机制。首先我们需要一个函数来实现时间控制:
var tic = function(timmer, cb){ return new Promise(function(resolve, reject) { setTimeout(function() { cb(); resolve(); }, timmer); }); };如果把问题简化一下,如果只需要一个周期,那么利用Promise应该这样写:
var d = new Promise(function(resolve, reject){resolve();}); var step = function(def) { def.then(function(){ return tic(3000, red); }).then(function(){ return tic(2000, green); }).then(function(){ return tic(1000, yellow); }); }现在一个周期已经有了,剩下的问题是如何让他无限循环。说道循环很容易想到
for
while
do-while这三个,比如:
var d = new Promise(function(resolve, reject){resolve();}); var step = function(def) { while(true) { def.then(function(){ return tic(3000, red); }).then(function(){ return tic(2000, green); }).then(function(){ return tic(1000, yellow); }); } }如果你是这样想的,那么恭喜你成功踩了坑!这道题的第二个考查点就是setTimeout相关的异步队列会挂起知道主进程空闲。如果使用while无限循环,主进程永远不会空闲,setTimeout的函数永远不会执行!正确的解决方法就是这道题的第三个考查点——递归!!!解决方案如下:
var d = new Promise(function(resolve, reject){resolve();}); var step = function(def) { def.then(function(){ return tic(3000, red); }).then(function(){ return tic(2000, green); }).then(function(){ return tic(1000, yellow); }).then(function(){ step(def); }); }整体代码如下:
function red(){ console.log('red'); } function green(){ console.log('green'); } function yellow(){ console.log('yellow'); }同时可以看到虽然Promise可以用来解决回调地狱问题,但是仍然不可避免的会有回调出现,更好的解决方案是利用
var tic = function(timmer, cb){ return new Promise(function(resolve, reject) { setTimeout(function() { cb(); resolve(); }, timmer); }); };
var d = new Promise(function(resolve, reject){resolve();}); var step = function(def) { def.then(function(){ return tic(3000, red); }).then(function(){ return tic(2000, green); }).then(function(){ return tic(1000, yellow); }).then(function(){ step(def); }); }
step(d);
Generator来减少回调:
var tic = function(timmer, str){ return new Promise(function(resolve, reject) { setTimeout(function() { console.log(str); resolve(1); }, timmer); }); }; function *gen(){ yield tic(3000, 'red'); yield tic(1000, 'green'); yield tic(2000, 'yellow'); } var iterator = gen(); var step = function(gen, iterator){ var s = iterator.next(); if (s.done) { step(gen, gen()); } else { s.value.then(function() { step(gen, iterator); }); } } step(gen, iterator);
相关文章推荐
- 一道关于Promise应用的面试题
- 一道关于Promise应用的面试题
- 关于一道promise的面试题
- 一道关于try,finally执行顺序的面试题
- 关于ES6中的promise用法以及在ajax中的应用
- 一道腾讯的面试题,关于a和&a
- 一道腾讯的面试题,关于a和&a
- 一道前端面试题,关于函数声明和函数表达式
- MySQL之一道关于GROUP BY的经典面试题
- 一道关于PHP类型转换的面试题
- 对一道面试题的总结与扩展思考(关于一笔画问题的数学分析)
- (转)关于一道1到N自然数排序的华为面试题
- 关于一道java面试题的分析
- 关于线程锁定的一道面试题
- 一道关于静态变量的初始化顺序面试题
- 一道腾讯关于字符串匹配的面试题
- [面试珠玑]一道关于C++虚函数和多继承的面试题
- 关于一道简单的Java 基础面试题的剖析: short s1=1;s1 = s1 +1会报错吗?
- 关于一道google面试题的java算法
- 一道关于AVG函数和NULL值的面试题