美文网首页ES6
es6笔记之九-Promise

es6笔记之九-Promise

作者: AizawaSayo | 来源:发表于2019-03-28 18:43 被阅读0次

    Promise: 可理解为承诺,许诺
    主要作用: 解决异步回调问题
    正常情况下传统方式,大部分都是用回调函数,事件驱动去解决

    ajax(url,{  //获取token
        ajax(url,()=>{  //获取用户信息
            ajax(url, ()=>{
            //获取用户相关新闻
        })
        })
    })
    嵌套模式确保获取到上一层数据再执行内部函数
    

    语法:

    let promise = new Promise(function(resolve, reject){
         //resolve,   成功调用
         //reject     失败调用
    });
    promise.then(success, fail);//成功方法,失败方法
    promise.then(res=>{
    }, err=>{           
    })
    
    

    实例:

    let a = 10;
    let promise = new Promise(function(resolve, reject){
        if(a==10){
            resolve('成功');
        }else{
            reject('失败鸟');
        }
    });
    promise.then(res=>{
        console.log(res);//成功
    },err=>{//第二个参数这个方法写得很少,一般直接用catch代替
        console.log(err);
    })
    promise.catch(err=>{  //reject,发生错误,别名
        console.log(err);//
    })
    

    用了catch后then方法的第二个参数方法就不必写了,写了也会报错。

    promise.then(res=>{
        console.log(res);
    }).catch(err=>{  //reject,发生错误,别名
        console.log(err);
    })
    

    推荐用法:

    new Promise().then(res=>{
    
    }).catch(err=>{
                
    })
    

    Promise.resolve()
    将现有的东西,转成一个promise对象, resolve状态/成功状态

    Promise.resolve('aaa') 
    let p1 = Promise.resolve('aaa');/
    p1.then(res=>{
        console.log(res);
    });
    

    等价于:

    new Promise(resolve =>{
        resolve('aaa')
    });
    let p2 = new Promise(resolve =>{
        resolve('aaa')
    });
    p2.then(res=>{
        console.log(res);//aaa
    })
    

    Promise.reject()
    将现有的东西,转成一个promise对象,reject状态/失败状态
    等价于:

    new Promise((resolve, reject) =>{
        reject('aaa')
    });
    
    let p1 = Promise.reject('aaaa');
    p1.then(res=>{
        console.log(res);//当然无输出
    }).catch(err=>{
        console.log(err);//aaaa
    })
    

    √ Promise.all([p1, p2, p3])
    把promise打包,扔到一个数组里面,打包完还是一个promise对象。
    必须确保所有的集合里的promise对象,都是resolve状态/成功状态

    let p1 = Promise.resolve('aaaa');
    let p2 = Promise.resolve('bbbb');
    let p3 = Promise.resolve('cccc');
    
    Promise.all([p1,p2,p3]).then(res=>{
        console.log(res);//["aaaa", "bbbb", "cccc"]
        let [res1, res2, res3] = res;//解构
        console.log(res1, res2, res3);//aaaa bbbb cccc
    })
    

    运用场景,将几个请求返回的数据集合在一起。
    Promise.race([p1, p2, p3])
    按组合的顺序开始返回成功的,知道遇到reject/失败的就停止

    let p1 = Promise.resolve('aaaa');
    let p2 = Promise.reject('bbbb');
    let p3 = Promise.resolve('cccc');
    
    Promise.race([p1,p2,p3]).then(res=>{
        console.log(res);//aaaa
    })
    

    通常Promise.all([p1,p2,p3])用得多,配合ajax用

    模拟用户登录获取用户信息实例

    let status = 1;
    let userLogin = (resolve, reject) =>{
         setTimeout(()=>{
             if(status == 1){
                 resolve({data:'登录成功', msg:'xxx', token:'xxsadfsadfas'});
             }else{
                 reject('失败了');
            }
        },2000);
    };
    
    let getUserInfo = (resolve, reject) =>{
        setTimeout(()=>{
            if(status == 1){
                resolve({data:'获取用户信息成功', msg:'asdfasdf', token:'xxsadfsadfas'});
            }else{
            reject('失败了');
        }
        },1000);
    };
    
    new Promise(userLogin).then(res=>{
        console.log('用户登录成功');
        return new Promise(getUserInfo);//{data: "获取用户信息成功", msg: "asdfasdf", token: "xxsadfsadfas"}
    }).then(res=>{
        console.log('获取用户信息成功');
        console.log(res);
    })
    

    相关文章

      网友评论

        本文标题:es6笔记之九-Promise

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