JS 中使用Promise 实现红绿灯实例代码(demo)


Posted in Javascript onOctober 20, 2017

要求

  • 使用promise 实现红绿灯颜色的跳转
  • 绿灯执行三秒后
  • 黄灯执行四秒后
  • 红灯执行五秒

html 实现如下:

<ul id="traffic" class="">
 <li id="green"></li>
 <li id="yellow"></li>
 <li id="red"></li>
</ul>

定义一个空类,之后再js中操作对应的类名即可实现相关的效果。

CSS实现如下:

ul {
 position: absolute;
 width: 200px;
 height: 200px;
 top: 50%;
 left: 50%;
 transform: translate(-50%,-50%);
}
 /*画3个圆代表红绿灯*/
 ul >li {
  width: 40px;
  height: 40px;
  border-radius:50%;
  opacity: 0.2;
  display: inline-block;
 }
 /*执行时改变透明度*/
 ul.red >#red, 
 ul.green >#green,
 ul.yellow >#yellow{
  opacity: 1.0;
 }
 /*红绿灯的三个颜色*/
 #red {background: red;}
 #yellow {background: yellow;}
 #green {background: green;}

javascript原理:

promise函数为一个异步操作函数,在函数运行结束时可以使用then()方法。我们再在promise函数内部设置延迟执行即可实现。

js 代码如下:

function timeout(timer){
  return function(){ 
   return new Promise(function(resolve,reject){
   setTimeout(resolve,timer) 
   })  
  }
  }
 var green = timeout(3000);
 var yellow = timeout(4000);
 var red = timeout(5000);
 var traffic = document.getElementById("traffic");
 (function restart(){
  'use strict'      //严格模式
  console.log("绿灯"+new Date().getSeconds()) //绿灯执行三秒 
  traffic.className = 'green';
  green()
  .then(function(){
   console.log("黄灯"+new Date().getSeconds()) //黄灯执行四秒
   traffic.className = 'yellow';
   return yellow();
  })
  .then(function(){
   console.log("红灯"+new Date().getSeconds()) //红灯执行五秒
   traffic.className = 'red';
   return red();
  }).then(function(){
   restart()
  })
  })();

Demo 请 点击这里!

ps:下面看一个Promise用法例子

注意:要想then方法能链式的执行下去,必须返回Promise对象!!! 

'use strict'; 
 
function async(value) { 
  return new Promise(function(resolve, reject) { 
    var ms = Math.round(Math.random() * 1000); 
    setTimeout(function() { 
      console.log('waiting ' + ms + 'ms'); 
      // 等待ms毫秒 
      resolve(value + ms); 
    }, ms); 
  }); 
} 
// 每次执行随机等待n毫秒,结果统计总毫秒数 
async(0) 
.then(async) 
.then(async) 
.then(async) 
.then(async) 
.then(function(value) { 
  console.log('------total wait:' + value + 'ms'); 
}); 
//////////////////////////////////////////////////////////// 
function async1(value) { 
  return new Promise(function(resolve, reject) { 
    resolve(value + 1); 
  }); 
} 
function async2(value) { 
  // return new Promise(function(resolve, reject) { 
  //   resolve(value + 2); 
  // }); 
  // 等价与上面写法 
  return Promise.resolve(value + 2); 
} 
function async3(value) { 
  return new Promise(function(resolve, reject) { 
    resolve(value + 3); 
  }); 
} 
async1(100).then(async2).then(async3).then(function(value) { 
  console.log('------' + value); 
}); 
///////////////////////////////////////////////////////////////// 
function say() { 
  var value = 'what'; 
  return Promise.resolve(value); 
} 
say().then(function(value) { 
  value = value + ' are'; 
  return Promise.resolve(value); 
}).then(function(value) { 
  value = value + ' you'; 
  return Promise.resolve(value); 
}).then(function(value) { 
  value = value + ' doing'; 
  return Promise.resolve(value); 
  //return Promise.reject('error, exit'); // 中途退出 
}).then(function(value) { 
  value = value + ' now!'; 
  return Promise.resolve(value); 
}).then(function(value) { 
  console.log('------' + value); 
}).catch(function(error) { 
  console.log('------' + error); 
}); 
<html> 
<head> 
  <title>Ball move</title> 
  <style type="text/css"> 
    .ball { 
      width: 40px; 
      height: 40px; 
      border-radius: 20px; 
      margin-left: 10px; 
    } 
    .ball1 { 
      background: #ff0000; 
    } 
    .ball2 { 
      background: #00ff00; 
    } 
    .ball3 { 
      background: #0000ff; 
    } 
  </style> 
  <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script> 
</head> 
<body> 
  <div class="ball ball1"></div> 
  <div class="ball ball2"></div> 
  <div class="ball ball3"></div> 
  <script type="text/javascript"> 
    function moving(ball, pos) { 
      return new Promise(function(resolve, reject) { 
        var marginLeft = parseInt(ball.css('margin-left')); 
        if (marginLeft != pos) { 
          var timerId = setInterval(function() { 
            marginLeft = marginLeft + 1; 
            ball.css('margin-left', marginLeft); 
            if (marginLeft == pos) { 
              clearInterval(timerId); 
              resolve(); 
            } 
          }, 20); 
        } else { 
          resolve(); 
        } 
      }); 
    } 
    moving($('.ball1'), 100).then(function() { 
      return moving($('.ball2'), 150); 
    }).then(function() { 
      return moving($('.ball3'), 200); 
    }); 
  </script> 
</body> 
</html>

总结

以上所述是小编给大家介绍的JS 中使用Promise 实现红绿灯实例代码(demo),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js中匿名函数的N种写法
Sep 08 Javascript
jquery 获取自定义属性(attr和prop)的实现代码
Jun 27 Javascript
使用javascript实现页面定时跳转总结篇
Sep 21 Javascript
js如何判断不同系统的浏览器类型
Oct 28 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
Feb 04 Javascript
Javascript让DEDECMS告别手写Tag
Sep 01 Javascript
JS通过ajax动态读取xml文件内容的方法
Mar 24 Javascript
jQuery实现的简洁下拉菜单导航效果代码
Aug 26 Javascript
JavaScript+canvas实现七色板效果实例
Feb 18 Javascript
jquery实现侧边栏左右伸缩效果的示例
Dec 19 jQuery
Vue3项目打包后部署到服务器 请求不到后台接口解决方法
Feb 06 Javascript
JS实现数据动态渲染的竖向步骤条
Jun 24 Javascript
用JavaScript做简易的购物车的代码示例
Oct 20 #Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
Oct 20 #Javascript
phantomjs导出html到pdf的方法总结
Oct 19 #Javascript
vue2.0设置proxyTable使用axios进行跨域请求的方法
Oct 19 #Javascript
vue resource post请求时遇到的坑
Oct 19 #Javascript
vue Element-ui input 远程搜索与修改建议显示模版的示例代码
Oct 19 #Javascript
JavaScript适配器模式详解
Oct 19 #Javascript
You might like
PHP完整的日历类(CLASS)
2006/11/27 PHP
PHP开发中四种查询返回结果分析
2011/01/02 PHP
解析php防止form重复提交的方法
2013/07/01 PHP
php实现微信扫码支付
2017/03/26 PHP
php 一维数组的循环遍历实现代码
2017/04/10 PHP
详解PHP处理字符串类似indexof的方法函数
2017/06/11 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
2013/06/28 Javascript
jQuery探测位置的提示弹窗(toolTip box)详细解析
2013/11/14 Javascript
javascript中Object使用详解
2015/01/26 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
浅谈使用MVC模式进行JavaScript程序开发
2015/11/10 Javascript
AngularJS ng-controller 指令简单实例
2016/08/01 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
2017/04/26 Javascript
JavaScript内存泄漏的处理方式
2017/11/20 Javascript
Vue集成Iframe页面的方法示例
2017/12/12 Javascript
Vue常见面试题整理【值得收藏】
2018/09/20 Javascript
JS实现的点击按钮图片上下滚动效果示例
2019/01/28 Javascript
浅析Vue 防抖与节流的使用
2019/11/14 Javascript
Vue自定义组件的四种方式示例详解
2020/02/28 Javascript
JS出现404错误原理及解决方案
2020/07/01 Javascript
JavaScript代码简化技巧实例解析
2020/09/09 Javascript
[13:55]Newbee vs Team Spirit
2018/06/07 DOTA
Python实现多并发访问网站功能示例
2017/06/19 Python
关于python多重赋值的小问题
2019/04/17 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
2019/07/04 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
Python实现随机爬山算法
2021/01/29 Python
thinkphp5 路由分发原理
2021/03/18 PHP
如何写一封打动人心的求职信
2014/02/17 职场文书
2014年平安创建工作总结
2014/11/24 职场文书
谢师宴学生致辞
2015/07/27 职场文书
python实现简单区块链结构
2021/04/25 Python
APP界面设计技巧和注意事项
2022/04/29 杂记