美文网首页
es6之深入理解Promise

es6之深入理解Promise

作者: 连小壮 | 来源:发表于2018-08-15 12:01 被阅读0次

    一、promise入门

    1. Promise对象是什么

    回调函数的另一种原生实现,比之前回调函数的写法机构清晰,功能强大,
    

    2.以前回调这么写

    function a(fn){
        let h = 1;
        setTimeout(function(){
            if(h==1){
                fn(h)
            }else{
                throw Error('error!')
            }
        },1000)
    }
    //调用
    a(function(m){
        console.log(m+'callback')
    })
    

    3.用Promise 写回调

     function a(){
         return new Promise(function(resole,reject){
             setTimeout(function(){
                 if(h==1){
                     resole(h)
                 }else{
                     reject(error)
                 }
             },1000)
         })
     }
    //调用
    a().then(function(data){
        console.log(data)
    },function(err){
        console.log(err)
    })
    

    4.多层回调实现

    //函数封装
    function fn(n,callback){
     setTimeout(function(){
        callback(n)
     },1000)
    }
    function fn2(m,callback){
    
       setTimeout(function(){
        callback(m)
       },800)
    }
    function fn3(h,callback){
        setTimeout(function(){
            callback(h)
       },600)
    }
    //多层回调调用
    
    fn(1, function(n){
                    
        console.log('fn='+n);
        fn2(2,function(n2){
            
            console.log('fn2='+n2);
            fn3(3,function(n3){
                
                console.log('fn3='+n3)
                console.log('end')
            })
        })
    }); 
    
    

    可见(1)中多层回调写起来很乱,不利于维护,下面用Promise实现

    function pm(n){
        return new Promise(function(resolve,reject){
            setTimeout(function(){
                if(n){
                    resolve(n)
                }else{
                    reject(error)
                }
            },1000) 
        })
    }
    function pm2(n){
        return new Promise(function(resolve,reject){
            setTimeout(function(){
                if(n){
                    resolve(n)
                }else{
                    reject(error)
                }
            },1000) 
        })
    }
    function pm3(n){
        return new Promise(function(resolve,reject){
            setTimeout(function(){
                if(n){
                    resolve(n)
                }else{
                    reject(error)
                }
            },1000) 
        })
    }
    
    //调用
    pm(1).then(function(data){
        console.log('pm='+data);
        return pm2(2)
        
    }).then(function(data){
        console.log('pm2='+data);
        return pm3(3)
        
    }).then(function(data){
        console.log('pm3='+data);
        
    })
    
    

    用promise调用的写法更加直观

    二、Generator

    1.Generator函数

    (1)异步编程思想来写同步代码
    (2)遍历器生成函数
    (3)状态机,封装了多个内部状态。
    

    2.形式

    function* abc(){
        //yield 非必须,return 也非必须;
        yield 'a';
        yield 'b';
        return 'c'
    }
    //调用
    var h = abc();
    h.next();//{value:'a',done:false}
    h.next();//{value:'b',done:false}
    h.next();//{value:'c',done:true}
    h.next();//{value:undefined,done:true}
    

    3.把Promise用Generator函数表示

    function pm(n){
        return new Promise((resolve,reject)=>{
            setTimeout(function(){
            console.log(n)
            resolve()
            },1000) 
        })
        
        
        
    }
    function pm2(n){
        return new Promise((resolve,reject)=>{
            setTimeout(function(){
            console.log(n)
             resolve()
            },800)  
        })
    }
    function pm3(n){
        return new Promise((resolve,reject)=>{
            setTimeout(function(){
            console.log(n)
             resolve()
            },600)  
        })
    }
    
    function* gPm(){
        yield pm(1);
        yield pm2(2);
        yield pm3(3);
    }
    let p = gPm();
    p.next().value.then(function(){
        p.next().value.then(function(){
            p.next().value.then(function(){
            
            })
        })
    })
    

    在调用的时候用Generator函数;代码更加同步化

    三、async/await

    1. async/await是什么

    (1)异步操作的终极解决方案
    

    2. 写法

    function pm(n){
        return new Promise((resolve,reject)=>{
            setTimeout(function(){
            console.log(n)
            resolve()
            },1000) 
        })
        
        
        
    }
    function pm2(n){
        return new Promise((resolve,reject)=>{
            setTimeout(function(){
            console.log(n)
             resolve()
            },800)  
        })
    }
    function pm3(n){
        return new Promise((resolve,reject)=>{
            setTimeout(function(){
            console.log(n)
             resolve()
            },600)  
        })
    }
    
    async function p(){
        await pm(1)
        await pm2(2)
        await pm3(3)
    }
    p()
    
    

    四、总结

    不管用then还是用generator 还是用async,都保证你写的function 的返回值是一个promise对象

    相关文章

      网友评论

          本文标题:es6之深入理解Promise

          本文链接:https://www.haomeiwen.com/subject/gdoibftx.html