Promise初体验
想通过回调函数做一个动画效果:三个小球依次运动,第一个小球运动到指定位置后回调第二个小球运动,依次类推,效果如图所示:
到第三个小球到达指定位置再回调,让第二个小球往回移动,直到最后一个小球回到原位:
具体实现过程使用了简单的定时器,代码如下:
- var ball1 = document.querySelector('.ball1');
- var ball2 = document.querySelector('.ball2');
- var ball3 = document.querySelector('.ball3');
- function animate(ball, distance, cb) {
- setTimeout(function() {
- var marginLeft = parseInt(ball.style.marginLeft, 10);
- if (marginLeft === distance) {
- cb && cb();
- }
- else {
- if (marginLeft < distance) {
- marginLeft ++;
- }
- else {
- marginLeft --;
- }
- ball.style.marginLeft = marginLeft + 'px';
- animate(ball, distance, cb)
- }
- },13)
- }
回调函数:
- animate(ball1, 100, function() {
- animate(ball2, 100, function() {
- animate(ball3, 100, function() {
- animate(ball3, 0, function() {
- animate(ball2, 0, function() {
- animate(ball1, 0, function() {
- alert(666)
- })
- })
- })
- })
- })
- })
看着这阶梯一般的回调函数,强迫症患者可能会很爽,但如果有成百上千的回调函数,这将会是一场灾难;
现在我们用promise重新写一下上面的函数。
首先安装bluebird,防止浏览器不兼容promise。
promise暴露在全局,可以直接var Promise = window.Promise;
重写promiseAnimate函数:
- function promiseAnimate(ball, distance) {
- return new Promise(function(resolve, reject) {
- function _animate() {
- setTimeout(function() {
- var marginLeft = parseInt(ball.style.marginLeft, 10);
- if (marginLeft === distance) {
- resolve()
- }
- else {
- if (marginLeft < distance) {
- marginLeft ++;
- }
- else {
- marginLeft --;
- }
- ball.style.marginLeft = marginLeft + 'px';
- _animate();
- }
- },13)
- }
- _animate();
- })
- }
使用promise的then方法回调:
- promiseAnimate(ball1, 100)
- .then(function() {
- return promiseAnimate(ball2, 100)
- })
- .then(function() {
- return promiseAnimate(ball3, 100)
- })
- .then(function() {
- return promiseAnimate(ball3, 0)
- })
- .then(function() {
- return promiseAnimate(ball2, 0)
- })
- .then(function() {
- return promiseAnimate(ball1, 0)
- })
使用then后,我们可以链式的回调,一目了然,简洁清晰!
当然promise还有很多特性,今天只是初步尝试一下~
Promise初体验的更多相关文章
- promise初体验,小白也能看懂
promise出现的目的一为处理JavaScript里的异步,再就是避免回调地狱. promise有三种状态:pending/reslove/reject . pending就是未决,resolve可 ...
- Vue-cli的打包初体验
前言:我司是一个教育公司,最近要做一个入学诊断的项目,领导让我开始搭建一套基于vue的H5的开发环境.在网上搜集很多的适配方案,最终还是选定flexible方案.选择它的原因很简单: 它的github ...
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验
Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
- Xamarin.iOS开发初体验
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0
- 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...
- 【Knockout.js 学习体验之旅】(1)ko初体验
前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
- 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验
在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...
随机推荐
- Mybatis之动态构建SQL语句
今天一个新同事问我,我知道如何利用XML的方式来构建动态SQL,可是Mybatis是否能够利用注解完成动态SQL的构建呢?!!答案是肯定的,MyBatis 提供了注解,@InsertProvider, ...
- 显示linux开机时间的脚本
最初的讨论是linux吧吧友@九十钩圈凯_ 发布的主题贴<加到自启动可以看开机时间的玩意> 并给出显示开机秒数的shell语句 [shell] [ $_UTED = 0 ] || noti ...
- SQL Server之记录筛选(top、ties、offset)汇总
一.TOP 筛选 如果有 ORDER BY 子句,TOP 筛选将根据排序的结果返回指定的行数.如果没有 ORDER BY 子句,TOP 筛选将按照行的物理顺序返回指定的行数. 1. 返回指定数目的行 ...
- 解决Shockwave flash在chrome该浏览器崩溃
越来越多的人开始使用chrome浏览器,很多用户都遇到过flash崩溃.有时重启chrome为了解决,有时不可能使用chrome无论打开什么网站是什么flash.这个问题是非常小的Firefox或IE ...
- Mysql高级之主从复制
原文:Mysql高级之主从复制 主从复制不就是多台服务器嘛!,一个改变另一个也改变啦,内容其实都一样! 原理: 对数据库进行操作会生成一个文件,binlog(二进制文件),从服务器配置relaylog ...
- QQ三方登录步骤详解
首先,登录QQ互联:http://connect.qq.com/intro/login ,注册成为开发者 选择申请加入,并创建你的应用. 创建成功后可以获取到appid和appkey 在网站的主页引 ...
- C语言指针操作
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/pointer-manipulation. ...
- Love myself...
Sometimes we feel as if our lives rely on that one person. We think 'If I do this, he/she will like ...
- Vi编辑器入门
Vi编辑器入门 vi编辑器是所有Unix及Linux系统下标准的编辑器,类似于windows上的记事本! 1.vi的基本概念 基本上vi可以分为三种状态,分别是命令模式(command mode ...
- C语言面试问答5
12个滑稽的C语言面试问答——<12个有趣的C语言问答>评析(5) 前文链接:http://www.cnblogs.com/pmer/archive/2013/09/17/3327262. ...