promise应用示例讲解
来源:互联网 发布:淘宝怎么做虚拟产品 编辑:程序博客网 时间:2024/06/08 15:51
Q:红灯三秒亮一次,绿灯一秒亮一次,黄灯2秒亮一次;如何让三个灯不断交替重复亮灯?(用Promse实现)三个亮灯函数已经存在:
functionred(){
console.log('red');
}
functiongreen(){
console.log('green');
}
functionyellow(){
console.log('yellow');
}
这道题首先考察Promise的应用,Promise的详细说明请看我的这篇文章:闲话Promise机制。首先我们需要一个函数来实现时间控制:
vartic = function(timmer,cb){
returnnewPromise(function(resolve,reject){
setTimeout(function(){
cb();
resolve();
},timmer);
});
};
如果把问题简化一下,如果只需要一个周期,那么利用Promise应该这样写:
vard = newPromise(function(resolve,reject){resolve();});
varstep = function(def){
def.then(function(){
returntic(3000,red);
}).then(function(){
returntic(2000,green);
}).then(function(){
returntic(1000,yellow);
});
}
现在一个周期已经有了,剩下的问题是如何让他无限循环。说道循环很容易想到for while do-while这三个,比如:
vard = newPromise(function(resolve,reject){resolve();});
varstep = function(def){
while(true){
def.then(function(){
returntic(3000,red);
}).then(function(){
returntic(2000,green);
}).then(function(){
returntic(1000,yellow);
});
}
}
如果你是这样想的,那么恭喜你成功踩了坑!这道题的第二个考查点就是setTimeout相关的异步队列会挂起知道主进程空闲。如果使用while无限循环,主进程永远不会空闲,setTimeout的函数永远不会执行!
正确的解决方法就是这道题的第三个考查点——递归!!!解决方案如下:
vard = newPromise(function(resolve,reject){resolve();});
varstep = function(def){
def.then(function(){
returntic(3000,red);
}).then(function(){
returntic(2000,green);
}).then(function(){
returntic(1000,yellow);
}).then(function(){
step(def);
});
}
整体代码如下:
functionred(){
console.log('red');
}
functiongreen(){
console.log('green');
}
functionyellow(){
console.log('yellow');
}
vartic = function(timmer,cb){
returnnewPromise(function(resolve,reject){
setTimeout(function(){
cb();
resolve();
},timmer);
});
};
vard = newPromise(function(resolve,reject){resolve();});
varstep = function(def){
def.then(function(){
returntic(3000,red);
}).then(function(){
returntic(2000,green);
}).then(function(){
returntic(1000,yellow);
}).then(function(){
step(def);
});
}
step(d);
同时可以看到虽然Promise可以用来解决回调地狱问题,但是仍然不可避免的会有回调出现,更好的解决方案是利用Generator来减少回调:
vartic = function(timmer,str){
returnnewPromise(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');
}
variterator = gen();
varstep = function(gen,iterator){
vars = iterator.next();
if(s.done){
step(gen,gen());
}else{
s.value.then(function(){
step(gen,iterator);
});
}
}
step(gen,iterator);
- promise应用示例讲解
- 大白话讲解Promise
- 详细讲解Promise
- Promise系列05:Promise应用
- javascript闭包-讲解应用示例
- 大白话讲解Promise(一)
- 大白话讲解Promise(一)
- 大白话讲解Promise(一)
- 大白话讲解Promise(一)
- 大白话讲解Promise(一)
- 大白话讲解Promise(一)
- 大白话讲解Promise(一)
- 大白话讲解Promise(一)
- 大白话讲解Promise(一)
- 大白话讲解Promise(一)
- promise应用问题
- js的promise应用
- promise详解以及示例代码
- 解决KeSetTimer定时精度不够方法
- JAVA基础之运算符
- 一个简单求和函数的matlab实现(带程序耗时功能)
- Powershell中禁止执行脚本解决办法(about_Execution_Policies)
- 欢迎使用CSDN-markdown编辑器
- promise应用示例讲解
- JAVA入门 新手看类与对象
- Structs2 命名空间
- JAVA基础之程序流程控制:判断结构
- TCP/IP详解(五)---IP选路
- 模式识别(Pattern Recognition)学习笔记(十一)--SVM支持向量机(狭义):大间隔
- LeetCode题解(一)
- 关于mysql中的int(N)、char(N)和varchar(N)类型的简单说明
- BufferedReader/BufferedInputStream.readLine()