Promise简要说明

Promise可以处理一些异步操作;如像setTimeout、ajax处理异步操作是一函数回调的方式;当然ajax在jQuery版本升级过程中,编写方式也有所变动.

Promise是抽象异步处理对象以及对其进行各种操作的组件.

Promise最初被提出是在 E语言中, 它是基于并列/并行处理设计的一种编程语言。

创建promise对象的流程如下所示。

  1. new Promise(fn) 返回一个promise对象

  2. fn 中指定异步等处理

    • 处理结果正常的话,调用resolve(处理结果值)

    • 处理结果错误的话,调用reject(Error对象)

resolve("new Promise value......"); 会让这个promise对象立即进入确定(即resolved)状态,并将 "new Promise value......" 传递给后面then里所指定的 onFulfilled 函数

Promise.resolve(value); 的返回值也是一个promise对象,所以我们可以像下面那样接着对其返回值进行 .then 调用

    Promise 实现小球的运动

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Animate Ball</title>
<style type="text/css">
.ball {
width: 40px;
height: 40px;
border-radius: 20px;
margin-left: 0;
}
.ball1 {
background-color: yellow;
}
.ball2 {
background-color: red;
}
.ball3 {
background-color: blue;
}
</style>
</head>
<body>
<div class="ball ball1" style="margin-left:0px;"></div>
<div class="ball ball2" style="margin-left:0px;"></div>
<div class="ball ball3" style="margin-left:0px;"></div> <script type="text/javascript" src="./node_modules/bluebird/js/browser/bluebird.js"></script>
<script type="text/javascript" >
/*function animateBall(ball, distance, callback){
//setTimeout过渡效果
setTimeout(function(){
var marginLeft = parseInt(ball.style.marginLeft, 10);
console.log(marginLeft);
if(marginLeft==distance){
callback && callback();
}else{
if(marginLeft<distance){
marginLeft ++;
}
if(marginLeft>distance){
marginLeft--;
}
ball.style.marginLeft = marginLeft +'px';
//callback
animateBall(ball, distance, callback);
}
}, 13);
}
var ball1 = document.querySelector('.ball1');
var ball2 = document.querySelector('.ball2');
var ball3 = document.querySelector('.ball3');
animateBall(ball1, 150, function(){
animateBall(ball2, 250, function(){
animateBall(ball3, 350, function(){
animateBall(ball3, 200, function(){
animateBall(ball2, 100, function(){
animateBall(ball1, 50, function(){ })
})
})
})
})
})*/
var ball1 = document.querySelector('.ball1');
var ball2 = document.querySelector('.ball2');
var ball3 = document.querySelector('.ball3');
//promise
var Promise = window.Promise; //使用 promise 替代回调函数
function promiseAnimate(ball, distance){
return new Promise(function(resolve, reject) {
function _animate(){
//setTimeout过渡效果
setTimeout(function(){
var marginLeft = parseInt(ball.style.marginLeft, 10);
console.log(marginLeft);
if(marginLeft==distance){
//resolve函数:将Promise对象的状态从 “未完成”变为 “成功”(Pending ->Resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去
resolve(ball, distance);
}else{
if(marginLeft<distance){
marginLeft ++;
}
if(marginLeft>distance){
marginLeft--;
}
ball.style.marginLeft = marginLeft +'px';
//callback
_animate();
}
}, 13);
}
_animate();
});
}
promiseAnimate(ball1, 150)
.then(function(){
return promiseAnimate(ball2, 250);
}).then(function(){
return promiseAnimate(ball3, 300);
}).then(function(){
return promiseAnimate(ball3, 200);
}).then(function(){
return promiseAnimate(ball2, 100);
}).then(function(){
return promiseAnimate(ball1, 50);
})
</script>
</body>
</html>

总结 : Promise链式的编写方式解决回调函数深度嵌套问题

效果演示如下

作者:Avenstar

出处:http://www.cnblogs.com/zjf-1992/p/6562082.html

关于作者:专注于前端开发、喜欢阅读

本文版权归作者所有,转载请标明原文链接

资料参考

http://liubin.org/promises-book/#how-to-write-promise

http://ejohn.org/blog/how-javascript-timers-work/

http://www.cnblogs.com/zichi/p/4604053.html

谷歌翻译api http://translate.hotcn.top/

Promise实现小球的运动的更多相关文章

  1. HTML5 Canvas彩色小球碰撞运动特效

    脚本简介 HTML5 Canvas彩色小球碰撞运动特效是一款基于canvas加面向对象制作的运动小球动画特效.   效果展示 http://hovertree.com/texiao/html5/39/ ...

  2. HDU 6373(斜面上小球弹跳 运动分解)

    题意是给定两个点的位置,过原点引一条射线穿过第一个点,射线位置作为斜面位置,第二个点处令一小球自由落体,问小球能碰撞到斜面几次. 开始时想算出两次碰撞中小球沿斜面运动的距离,然后发现每一段距离会因为高 ...

  3. promise实例小球运动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. java 事件处理机制:按下上下左右键控制小球的运动

    /** * 加深对事件处理机制的理解 * 通过上下左右键来控制一个小球的位置 */package com.test3;import java.awt.*;import javax.swing.*;im ...

  5. JavaScript实例:运动的小球

    本篇博文通过制作一个小球运动动画的实例,来学习在HTML5的画布上实现动画制作的方法,同时理解面向对象程序设计的基本思想. 1.绘制小球 先在HTML页面中设置一个画布. <canvas id= ...

  6. Promise初体验

    想通过回调函数做一个动画效果:三个小球依次运动,第一个小球运动到指定位置后回调第二个小球运动,依次类推,效果如图所示: 到第三个小球到达指定位置再回调,让第二个小球往回移动,直到最后一个小球回到原位: ...

  7. javascript运动系列第五篇——缓冲运动和弹性运动

    × 目录 [1]缓冲运动 [2]弹性运动 [3]距离分析[4]步长分析[5]弹性过界[6]弹性菜单[7]弹性拖拽 前面的话 缓冲运动指的是减速运动,减速到0的时候,元素正好停在目标点.而弹性运动同样是 ...

  8. 基于canvas实现物理运动效果与动画效果(一)

    一.为什么要写这篇文章 某年某月某时某种原因,我在慕课网上看到了一个大神实现了关于小球的抛物线运动的代码,心中很是欣喜,故而写这篇文章来向这位大神致敬,同时也为了弥补自己在运动效果和动画效果制作方面的 ...

  9. 第七讲:HTML5中的canvas两个小球全然弹性碰撞

    <html> <head> <title>小球之间的碰撞(全然弹性碰撞)</title> <script src="../js/jsce ...

随机推荐

  1. nat的翻译类型(2)--动态nat

    目的:在1.1 1.2 1.3 三台内网的服务器访问外网的服务器(202.1.1.2)时,将内网ip转换为外网ip. 1.设置内网三台服务器的Ip ,网关,以及外网服务器的ip网关 分别为:192.1 ...

  2. MyBatis SQL处理大于、小于号

    MyBatis mapper文件是xml文件,需要特殊字符如大于号.小于号后需要转义. 原字符 转义后字符 < < <= <= > > > >=

  3. MyBatis_查询缓存01

    一.查询缓存 查询缓存的使用,主要是为了提高查询访问速度.将用户对同一数据的重复查询过程简单化,不在每次均从数据库中查询获取结果数据,从而提高访问速度. MyBatis的查询缓存机制,根据缓存区的作用 ...

  4. 《JavaScript语言精粹》【PDF】下载

    <JavaScript语言精粹>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382204 内容简介 javascript曾是&q ...

  5. xamarin android如何监听单击事件

    在xamarin android单击事件是最基础的事情,看过菜鸟上的android教程时,java写的都是监听事件,为一个按钮,单选按钮.多选按钮的单击事件有三种,前面两种用的非常普遍,也很简易,我这 ...

  6. 如何检测mvc性能和sql语句

    mvc中使用linq如何检测sql语句 .net中使用mvc开发已经是一种趋势,不仅仅是.net ,java 等越来越多的开发者更倾向于mvc这种开发模式,在.net mvc 使用linq非常方便,各 ...

  7. bzoj 2427: [HAOI2010]软件安装

    Description 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和 ...

  8. 用node搭建简单的静态资源管理器

    我们都知道,老牌的3p服务器都是自带静态资源管理器的.但是node不同,它没有web容器,它的路由地址和真实地址可以没有联系,所有node的优点,是可以把路由做得相当漂亮. 但静态资源管理器也是必不可 ...

  9. 字符串MD5加密运算

    public static string GetMd5String(string str)       {           MD5 md5 = MD5.Create();           by ...

  10. 学习时用的软件最新 开发环境为Visual Studio 2010,数据库为SQLServer2005,使用.net 4.0开发。 超市管理系统

    一.源码特点 1.采用典型的三层架构进行开发.模板分离,支持生成静态 伪静态..购物车.登陆验证.div+css.js等技术二.功能介绍 1.本源码是一个超市在线购物商城源码,该网上商城是给超市便利店 ...