zoukankan      html  css  js  c++  java
  • Promise简记

    Promise

    "回调地狱"

    function d() {
    	console.log("hi")
    }
    
    d(function() {
    	console.log(2)
    	
    	d(function() {
    		console.log(3)
    		
    		d(function(){
    			console.log(5)
    			......
    		}
    	}
    })
    
    
    

     <script>
            let btn = document.querySelector("button")
            let box = document.querySelector("div")
        
            btn.addEventListener('click', e=> {
                moveTo(box,100,100).then(()=>{
                    console.log("第一次移动")
                    return moveTo(box,200,200)
                }).then(()=> {
                    console.log("第二次移动")
                    return moveTo(box,300,300)
                }).then(()=> {
                    console.log("第三次移动")
                    return moveTo(box,400,400)
                })
            })
            
            function moveTo(el,x,y){
                return new Promise((res)=> {
                    el.style.transform = `translate(${x}px,${y}px)`
                    setTimeout(function(){
                        res()
                        box.textContent = `我移动了${x}px`
                    },1000)
                
                })}
        // 小方块的移动
        
    
    // promise实现图片的加载
    
    <!DOCTYPE html>
    <html lang="zh-cn">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Promise</title>
        <style>
            div {
                180px;
                height: 180px;
                background: burlywood;
                transition: all 1s;
                text-align: center;
                font-size: 38px;
            }
            .wrap {
                transition: all 1s;
                100%;
                height:200px;
                background: #444;
            }
            img {
                float: left;
                height: 200px;
                 31%;
            }
        </style>
    </head>
    <body>
        <!-- <div></div>
        <button>点击</button> -->
        <div class="wrap"></div>
    	<script>
            let URL = ['http://climg.mukewang.com/5b16558d00011ed506000338.jpg',
                  'http://climg.mukewang.com/5b165603000146ca06000338.jpg ',
                  'http://climg.mukewang.com/5b1656140001c89906000338.jpg' ]
    
            let i = 0
            function loadImg(URL) {
                return new Promise((res,rej) => {
                    if(i<=3) {
                        setTimeout(()=>{
                            res(URL[i++]) 
                        },1000)
                    } else {
                        console.log("停止!")
                    }
                })
            }
    
            let wrap = document.querySelector(".wrap")
            loadImg(URL).then(function (url) {
                let img = document.createElement("img")
                img.src = url
                wrap.appendChild(img)
                return loadImg(URL)
            }).then(function (url) {
                let img = document.createElement("img")
                img.src = url
                wrap.appendChild(img)
                return loadImg(URL)
            }).then(function (url) {
                let img = document.createElement("img")
                img.src = url
                wrap.appendChild(img)
            })
            .catch(e => {
                console.log(e)
            })
    
    	</script>
    </body>
    </html>
    

    链式调用

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
        <script type="text/javascript">
        
        
        function cook() {
            console.log('开始做饭。');
            var p = new Promise(function(resolve, reject){ 
                setTimeout(function() {
                    console.log('做饭完毕!');
                    resolve('鸡蛋炒饭');
                }, 1000);
            });
            return p;
        }
        
        function eat(data) {
            console.log('开始吃饭:' + data);
            var p = new Promise(function(resolve, reject) {
                setTimeout(function() {
                    console.log('吃饭完毕!');
                    resolve('一块碗和一双筷子');
                }, 2000);
            });
            return p;
        }
        function wash(data) {
            console.log('开始洗碗:' + data);
            var p = new Promise(function(resolve, reject) { 
                setTimeout(function() {
                    console.log('洗碗完毕!');
                    resolve('干净的碗筷');
                }, 2000);
            });
            return p;
    }
        cook().then((e)=>{
            return eat(e)
        }).then((e)=>{
            console.log(e)
            return wash(e)
        })
    
    </script>
    </body>
    </html>
    

    1561018541974

    错误处理

    function cb(value) {
    	return new Promise((res,rej)){
    			if(value) resolve(value)
    			else reject(value)
    		}
    }
    
    cb(false).then(res=>console.log(res),rej=>console.log(rej))
    

    .then(resolve,reject)两个处理函数

    .catch(e => { console.log(e)}) 捕获未作处理的错误!

    .finaly(e => {console.log(e)}) 最终肯定会被执行的步!

    Promise的三种状态

    • pending
    • fulfilled
    • rejected

    Promise.all()

    Promise.all([promise1,promise2,promise3])
    

    当里面的promise的实例全部成功时返回对应参数,有一个失败会返回对应的失败参数

    var p1 = Promise.resolve(3);
    var p2 = 1337;
    var p3 = new Promise((resolve, reject) => {
      setTimeout(resolve, 100, 'foo');
    }); 
    
    Promise.all([p1, p2, p3]).then(values => { 
      console.log(values); // [3, 1337, "foo"] 
    });
    

    是空数组时会直接返回成功!

    Promise.race()

    Promise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。(谁先解决或者失败则结束返回先处理完的值)

    var promise1 = new Promise(function(resolve, reject) {
        setTimeout(resolve, 500, 'one');
    });
    
    var promise2 = new Promise(function(resolve, reject) {
        setTimeout(resolve, 100, 'two');
    });
    
    Promise.race([promise1, promise2]).then(function(value) {
      console.log(value);
      //都是resolve,但是promise2速度快!
    });
    // 最终输出: "two"
    

    空数组不会被处理!

    Promise.resolve()

    Promise.reject()

    Promise.resolve(value)方法返回一个以给定值解析后的Promise 对象。但如果这个值是个thenable(即带有then方法),返回的promise会“跟随”这个thenable的对象,采用它的最终状态(指resolved/rejected/pending/settled);如果传入的value本身就是promise对象,则该对象作为Promise.resolve方法的返回值返回;否则以该值为成功状态返回promise对象。

    (包裹后会返回一个Promise对象)

    • 将同步任务通过Promise转换为异步任务!
    function createAsyncTask(syncTask){
    	return Promise.resolve(syncTask).then(syncTask => syncTask())
    }
    
    createAsyncTask(()=> {
    	console.log("异步任务")
    	return 1+1
    }).then(res=>{
    	console.log(res)
    })
    
    console.log("同步任务")
    
    • 习题(页面中有个板块,需要多张图片加载后才能显示)

      
      

    Array.map()

  • 相关阅读:
    “Installation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED”
    【问底】夏俊:深入站点服务端技术(一)——站点并发的问题
    java反射调用方法
    linux 文件操作系统调用
    64位win7中使用vs2013为python3.4安装pycrypto-2.6.1插件报Unable to find vcvarsall.bat异常解决方式
    ViewPager+RadioGroup实现标题栏切换,Fragment切换
    Android View系统解析(下)
    高速学会Mac上托管代码到github(具体解释)
    linux程序设计——多线程(第十二章)
    使用工作流更新子记录
  • 原文地址:https://www.cnblogs.com/daixixi/p/11060893.html
Copyright © 2011-2022 走看看