1-2 先从一个牛逼闪闪的知识点 Promise 讲起

对应视频地址如下:

1-2 先从一个牛逼闪闪的知识点 Promise 讲起

  • 动画时间越短越流畅,一般一秒钟为60帧,平均一帧为16.7毫秒
  • npm install bluebird
  • function方法前加下划线_代表私有函数

源码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Promise animation</title>
    <style type="text/css">
        .ball {
            width: 40px;
            height: 40px;
            border-radius: 20px;
        }
        .ball1 {
            background-color: red;
        }
        .ball2 {
            background-color: yellow;
        }
        .ball3 {
            background-color: green;
        }
    </style>
    <script src="node_modules/bluebird/js/browser/bluebird.js"></script>
</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">
    var ball1 = document.querySelector('.ball1')
    var ball2 = document.querySelector('.ball2')
    var ball3 = document.querySelector('.ball3')
    function animate(ball, distance, callBack) {
        setTimeout(function () {
            var marginLeft = parseInt(window.getComputedStyle(ball, null).marginLeft, 10);
            if (marginLeft == distance) {
                callBack();
            } else {
                if (marginLeft < distance) {
                    marginLeft++;
                } else {
                    marginLeft--;
                }
                ball.style.marginLeft = marginLeft + "px";
                animate(ball, distance, callBack);
            }
        }, 13)
    }
    // animate(ball1, 100, function() {
    //     animate(ball2, 200, function() {
    //         animate(ball3, 300, function() {
    //             animate(ball3, 150, function() {
    //                 animate(ball2, 150, function() {
    //                     animate(ball1, 150)
    //                 })
    //             })
    //         })
    //     })
    // })
    var Promise = window.Promise;
    function promiseAnimate(ball, distance) {
        return new Promise(function (resolve, reject) {
            function _animate() {
                setTimeout(function () {
                    var marginLeft = parseInt(ball.style.marginLeft, 10)
                    if (marginLeft == distance) {
                        return resolve()
                    } else {
                        if (marginLeft < distance) {
                            marginLeft++
                        } else {
                            marginLeft--
                        }
                    }
                    ball.style.marginLeft = marginLeft + "px"
                    _animate()
                }, 13)
            }
            _animate()
        })
    }
    promiseAnimate(ball1, 100)
        .then(function () {
            return promiseAnimate(ball2, 200)
        }).then(function () {
        return promiseAnimate(ball3, 300)
    }).then(function () {
        return promiseAnimate(ball3, 150)
    }).then(function () {
        return promiseAnimate(ball2, 150)
    }).then(function () {
        return promiseAnimate(ball1, 150)
    })
</script>
</body>
</html>

双击该文件(ball.html)可查看到动画效果

简述:Promise是异步编程的一种解决方案。上面是Promise调用then方法实现类似同步执行

Promise的学习可参考以下(转载于他处):

Promise学习 

看这一篇就够了!浅谈ES6的Promise对象

posted on 2018-09-05 10:04  zxuemei  阅读(195)  评论(0编辑  收藏  举报

导航