Promise實現小球的運動

    Promise簡要說明javascript

Promise能夠處理一些異步操做;如像setTimeoutajax處理異步操做是一函數回調的方式;固然ajax在jQuery版本升級過程當中,編寫方式也有所變更.css

Promise是抽象異步處理對象以及對其進行各類操做的組件.html

Promise最初被提出是在 E語言它是基於並列/並行處理設計的一種編程語言。前端

建立promise對象的流程以下所示。java

  1. new Promise(fn) 返回一個promise對象node

  2. fn 中指定異步等處理ajax

    • 處理結果正常的話,調用resolve(處理結果值)編程

    • 處理結果錯誤的話,調用reject(Error對象)api

resolve("new Promise value......"); 會讓這個promise對象當即進入肯定(即resolved)狀態,並將 "new Promise value......" 傳遞給後面then裏所指定的 onFulfilled 函數promise

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/

相關文章
相關標籤/搜索