JS动画实现回调地狱promise的实例代码详解


Posted in Javascript onNovember 08, 2018

1. js实现动画

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>animate</title>
  <style>
    .ball {
      width: 40px;
      height: 40px;
      margin-bottom: 5px;
      border-radius: 20px;
    }
    .ball1 {
      background: red;
    }
    .ball2 {
      background: blue;
    }
    .ball3 {
      background: yellow;
    }
  </style>
</head>
<body>
  <div class="ball ball1" style="margin-left: 0"></div>
  <div class="ball ball2" style="margin-left: 0"></div>
  <div class="ball ball3" style="margin-left: 0"></div>
  <script>
    var ball1 = document.querySelector(".ball1");
    var ball2 = document.querySelector(".ball2");
    var ball3 = document.querySelector(".ball3");
    function animate(ball, left, callback) {
      setTimeout(function () {
        var marginLeft = parseInt(ball.style.marginLeft, 10);
        if (marginLeft === left) {
          callback && callback();
        } else {
          if (marginLeft < left) {
            marginLeft += 2;
          } else {
            marginLeft -= 2;
          }
          ball.style.marginLeft = marginLeft + "px";
          animate(ball, left, callback);
        }
      }, 13);
    }
    animate(ball1, 100, function () {
      animate(ball2, 200, function () {
        animate(ball3, 300, function () {
          animate(ball1, 200, function () {
            animate(ball3, 200, function () {
              animate(ball2, 180, function () {
                animate(ball2, 220, function () {
                  animate(ball2, 200, function () {
                    console.log("over");
                  })
                })
              })
            })
          })
        }) 
      })
    });
  </script>
</body>
</html>

上述代码就可以实现一个动画。注意下面几点:

•动画的实现往往依赖于setTimeout。
•注意ele.style.marginLeft如果开始能够获取,必须从元素的style中设置了才能获取,否则获取不到。
•利用callback可以实现虽然使用了setTimeout还能串行执行。

但是这产生了回调地狱,代码简单点还好说,一旦代码复杂了,我们将很难处理其中的逻辑。所以这时就可以用到es6中的promise了。

Promise的写法如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>animate</title>
  <style>
    .ball {
      width: 40px;
      height: 40px;
      margin-bottom: 5px;
      border-radius: 20px;
    }
    .ball1 {
      background: red;
    }
    .ball2 {
      background: blue;
    }
    .ball3 {
      background: yellow;
    }
  </style>
</head>
<body>
  <div class="ball ball1" style="margin-left: 0"></div>
  <div class="ball ball2" style="margin-left: 0"></div>
  <div class="ball ball3" style="margin-left: 0"></div>
  <script>
    var ball1 = document.querySelector(".ball1");
    var ball2 = document.querySelector(".ball2");
    var ball3 = document.querySelector(".ball3");
    function promiseAnimate(ball, left) {
      return new Promise(function (resolve, reject) {
        function animate(ball, left) {
          setTimeout(function () {
            var marginLeft = parseInt(ball.style.marginLeft, 10);
            if (marginLeft === left) {
              resolve();
            } else {
              if (marginLeft < left) {
                marginLeft += 2;
              } else {
                marginLeft -= 2;
              }
              ball.style.marginLeft = marginLeft + "px";
              animate(ball, left);
            }
          }, 13);
        }
        animate(ball,left);
      });
    }
    promiseAnimate(ball1, 500)
    .then(function () {
      return promiseAnimate(ball2, 200);
    })
    .then(function () {
      return promiseAnimate(ball3, 300);
    })
    .then(function () {
      return promiseAnimate(ball1, 200);
    })
    .then(function () {
      return promiseAnimate(ball3, 200);
    })
    .then(function () {
      return promiseAnimate(ball2, 180);
    })
    .then(function () {
      return promiseAnimate(ball2, 220);
    })
    .then(function () {
      return promiseAnimate(ball2, 200);
    })
  </script>
</body>
</html>

这同样可以达到效果,并且这样做的好处是,修改更加容易一些。对于promise,有几点需要注意:

1.在执行promise相关函数的时候,要返回一个promise对象,这是常用的做法。
2.只有返回了promise对象,我们才能实用then。
3.并且在then中还要返回promise对象,这样我们就可以不断的使用then()来管理异步。
4.在promise执行之后,要使用resolve()来表明这个promise执行的结束。 这样,才能执行then方法。

问题: 在then中如果直接执行promiseAnimate(ball2, 200);不可以吗?  为什么一定要return呢?

答: 当然不可以,因为如果直接执行,确实返回了一个promise对象,但是这个promise对象只是在then下面的函数中啊, 我们必须在这个函数继续返回这个promise对象才能达到继续使用then的目的。

其中resolve()代表着这个异步过程的结束。

综上所述: 动画多用setTimeout和调用自己的方式执行,当然,使用setInterval也是一样的,只是前者我们更为推荐。 无论是使用setTimeout还是setInterval,都不可避免的会产生如果解决异步的问题。 之前我们解决异步的方式是使用回调函数,但是回调函数非常容易就会产生回调地狱,所以用promise会更好一些。

总结

以上所述是小编给大家介绍的JS动画实现回调地狱promise的实例代码详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
静态的动态续篇之来点XML
Dec 23 Javascript
用Juery网页选项卡实现代码
Jun 13 Javascript
一个基于jquery的文本框记数器
Sep 19 Javascript
iScroll中事件点击触发两次解决方案
Mar 11 Javascript
JS拖拽插件实现步骤
Aug 03 Javascript
JavaScript入门基础
Aug 12 Javascript
基于javascript实现仿百度输入框自动匹配功能
Jan 03 Javascript
自学实现angularjs依赖注入
Dec 20 Javascript
手机端转换rem适应
Apr 01 Javascript
vue form check 表单验证的实现代码
Dec 09 Javascript
javascript网页随机点名实现过程解析
Oct 15 Javascript
vue项目引入ts步骤(小结)
Oct 31 Javascript
深入解析ES6中的promise
Nov 08 #Javascript
vue中promise的使用及异步请求数据的方法
Nov 08 #Javascript
node使用Mongoose类库实现简单的增删改查
Nov 08 #Javascript
webpack4+express+mongodb+vue实现增删改查的示例
Nov 08 #Javascript
Echarts之悬浮框中的数据排序问题
Nov 08 #Javascript
Jquery和CSS实现选择框重置按钮功能
Nov 08 #jQuery
基于React Native 0.52实现轮播图效果
Aug 25 #Javascript
You might like
PHP中strtotime函数使用方法分享
2012/01/10 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
php实现的简单多进程服务器类完整示例
2020/02/01 PHP
js之ActiveX控件使用说明 new ActiveXObject()
2014/03/03 Javascript
Css3制作变形与动画效果
2015/07/24 Javascript
JS+CSS实现滑动切换tab菜单效果
2015/08/25 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
2015/12/01 Javascript
基于JavaScript实现div层跟随滚动条滑动
2016/01/12 Javascript
jquery easyui dataGrid动态改变排序字段名的方法
2017/03/02 Javascript
完美解决浏览器跨域的几种方法(汇总)
2017/05/08 Javascript
JS实现按钮添加背景音乐示例代码
2017/10/17 Javascript
使用svg实现动态时钟效果
2018/07/17 Javascript
element form 校验数组每一项实例代码
2019/10/10 Javascript
Python中input和raw_input的一点区别
2014/10/21 Python
Python 抓取动态网页内容方案详解
2014/12/25 Python
Python实现Windows上气泡提醒效果的方法
2015/06/03 Python
初步剖析C语言编程中的结构体
2016/01/16 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
2018/02/23 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
2018/11/29 Python
Django model反向关联名称的方法
2018/12/15 Python
python实现Flappy Bird源码
2018/12/24 Python
在cmd中查看python的安装路径方法
2019/07/03 Python
Python pandas用法最全整理
2019/08/04 Python
python3 实现的对象与json相互转换操作示例
2019/08/17 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
2019/11/15 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
实习自我鉴定模板
2013/09/28 职场文书
巡警年度自我鉴定
2014/02/21 职场文书
幼儿园家长寄语
2014/04/02 职场文书
2014国庆65周年领导讲话稿(3篇)
2014/09/21 职场文书
vue3中的组件间通信
2021/03/31 Vue.js
Java实现聊天机器人完善版
2021/07/04 Java/Android
四十九个javascript小知识实用技巧
2021/11/20 Javascript
SQL SERVER实现连接与合并查询
2022/02/24 SQL Server