zoukankan      html  css  js  c++  java
  • 深入理解es6的promise

    一、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**对象


    我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=f12524hxoqvv

  • 相关阅读:
    Android Studio 单刷《第一行代码》系列 05 —— Fragment 基础
    Android Studio 单刷《第一行代码》系列 04 —— Activity 相关
    Android Studio 单刷《第一行代码》系列 03 —— Activity 基础
    Android Studio 单刷《第一行代码》系列 02 —— 日志工具 LogCat
    Android Studio 单刷《第一行代码》系列 01 —— 第一战 HelloWorld
    IDEA 内网手动添加oracle,mysql等数据源,以及server returns invalid timezone错误配置
    eclipse maven设置
    IntelliJ IDE 常用配置
    eclipse maven 常见问题解决方案
    Maven 安装和配置
  • 原文地址:https://www.cnblogs.com/lianxiaozhuang/p/9486585.html
Copyright © 2011-2022 走看看