• promise基本使用——简单的运动效果


     一开始接触到promise的时候也是比较懵逼的,不太理解他们的奥秘在哪儿,以及我们为什么要使用它,随着深入的了解,觉得他很大程度了解决了我们之前的回调地域的问题,还有关于数据请求异步的方式,promise极大程度的解决了我们的代码多层嵌套难以阅读理解的问题。

    接着入正题,现在我们要实现一个边框的划入效果。这个效果实现起来也是很容易的,css3基本上就能够实现了,这里我们不讨论css3.只讨论js的使用。下面贴代码。

           <div class="box">
                <ul>
                    <li class="box_left"></li>
                    <li class="box_right"></li>
                    <li class="box_top"></li>
                    <li class="box_bottom"></li>
                </ul>
            </div>
            <script>
                function $_(name) {
                    return document.querySelector(name);
                }
                function getStyle(obj, attr) {
                    return getComputedStyle(obj)[attr];
                }
                function animate(obj, json, fn) {
                    clearInterval(obj.timer);
                    obj.timer = setInterval(function () {
                        var bstop = true;
                        for (var key in json) {
                            var icur;
                            if (key == "opacity") {
                                icur = Math.round(getComputedStyle(obj)[key] * 100);
                            }
                            else {
                                icur = parseInt(getComputedStyle(obj)[key]);
                            }
                            var speed = (parseInt(json[key]) - icur) / 6;
                            if (speed !== 0) {
                                bstop = false;
                            }
                            speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
                            if (key == "opacity") {
                                obj.style[key] = (icur + speed) / 100;
                            } else {
                                obj.style[key] = icur + speed + "px";
                            }
                        }
                        if (bstop) {
                            clearInterval(obj.timer);
                            fn && fn()
                        }
                    }, 30)
                }
                animate($_(".box ul li:first-child"), {
                    height: "106px"
                },function(){
                    animate($_(".box ul li:nth-child(3)"),{
                        "106px"
                    },function(){
                        animate($_(".box ul li:nth-child(2)"),{
                            height:"106px"
                        },function(){
                            animate($_(".box ul li:nth-child(4)"),{
                                "106px"
                            })
                        })
                    })
                })
            </script>
    

    效果演示如下

    如果使用jquery的小伙伴可以直接使用jquery的animate函数,这里我们使用的原生js,自己自定义实现了aniamte方法,当动画结束后会触发一个回调函数,这里我们就可以看到animate函数多层嵌套,看起来非常的不美观,而且如果写的很多的话自己很容易都会被绕晕。

    下面附上用promise实现的效果代码

           <div class="box">
                <ul>
                    <li class="box_left"></li>
                    <li class="box_right"></li>
                    <li class="box_top"></li>
                    <li class="box_bottom"></li>
                </ul>
            </div>
            <script>
                function $_(name) {
                    return document.querySelector(name);
                }
                function getStyle(obj, attr) {
                    return getComputedStyle(obj)[attr];
                }
                function promiseAnimate(obj, json) {
                    return new Promise(function (resolve,rejected) {
                        clearInterval(obj.timer);
                        obj.timer = setInterval(function () {
                            console.log(resolve)
                            var bstop = true;
                            for (var key in json) {
                                var icur;
                                if (key == "opacity") {
                                    icur = Math.round(getComputedStyle(obj)[key] * 100);
                                }
                                else {
                                    icur = parseInt(getComputedStyle(obj)[key]);
                                }
                                var speed = (parseInt(json[key]) - icur) / 6;
                                if (speed !== 0) {
                                    bstop = false;
                                }
                                speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
                                if (key == "opacity") {
                                    obj.style[key] = (icur + speed) / 100;
                                } else {
                                    obj.style[key] = icur + speed + "px";
                                }
                            }
                            if (bstop) {
                                clearInterval(obj.timer);
                                resolve()
                            }
                        }, 30)
                    })
                }
                promiseAnimate($_(".box ul li:first-child"),{height:"106px"})
                .then(function(){
                    return promiseAnimate($_(".box ul li:nth-child(3)"),{"106px"}) 
                })
                .then(function(){
                    return promiseAnimate($_(".box ul li:nth-child(2)"),{height:"106px"}) 
                })
                .then(function(){
                    return promiseAnimate($_(".box ul li:nth-child(4)"),{"106px"}) 
                })
            </script>
    

     这样一看代码是不是清晰了好多,promise实现的效果更易于阅读,也避免了之前的多层嵌套的问题,而且可以链式调用。最近一直在研究promise源码的实现,底层实现是有一点点绕,可能需要js基础比价扎实,我看了好几天才稍微有点头绪,未来的路很长,还需要不断的学习来充实自己。

  • 相关阅读:
    Oracle 获取本周、本月、本季、本年的第一天和最后一天(转载)
    easyui tabs页签显示在底部属性
    java mybatis XML文件中大于号小于号转义(转载)
    原生JS日历 + JS格式化时间格式
    ajax之async属性
    Easyui 行编辑
    css中实现显示和隐藏(转)
    layer弹出层 获取index
    js中关于json常用的内容、js将数字保留两位小数
    发布项目到github上web服务器来运行
  • 原文地址:https://www.cnblogs.com/shentao11023/p/11014530.html
Copyright © 2020-2023  润新知