美文网首页前端开发es6入门基础
ES6基础入门教程(十六)promise异步队列

ES6基础入门教程(十六)promise异步队列

作者: 党云龙 | 来源:发表于2019-11-13 11:15 被阅读0次

    介绍


    es6中加入了promise来统一规范异步行为。promise中可以接收两个参数,res代表成功获得异步的值以后运行什么方法,rej代表失败以后运行什么方法。

    let timer = new Promise((res,rej)=>{
        setTimeout(()=>{
            res("promise");
        },1000)
    })
    //直接把方法名传入promise对象即可
    function res(val){
        console.log(val)
    }
    
    

    promise对象的缺点:


    1.创建的时候就会立刻执行;
    2.一旦开始就不能停止;
    3.必须通过catch返回错误,否则不会弹出错误。

    // 这样的写法是错的,因为Promise对象创建的时候就会立即执行
    let timer = new Promise((res,rej)=>{
        setTimeout(()=>{
            console.log("promise");
        },1000)
    })
    
    

    promise 在处理多个异步函数执行的时候,有很大的优势,
    尤其是他在处理正确和错误的时候,分的特别明确,
    他唯一的缺点是当你需要一个队列的时候,你就需要一个then一个then往下写,
    非常难受。

    这里就为es7中async和await的诞生埋下了伏笔。

    let timer1 = function(){
        let p = new Promise((res,rej)=>{
            setTimeout(()=>{
                console.log("我是timer1");
                // res必须包含,没有这个东西你的函数触发.then
                // 表示成功后返回的内容
                res('timer1成功后返回的内容');
            },1500)
        })
        return p;
    }
    let timer2 = function(){
        let p = new Promise((res,rej)=>{
            setTimeout(()=>{
                console.log("我是timer2");
                res('timer2成功后返回的内容');
            },500)
        })
        return p;
    }
    let timer3 = function(){
        let p = new Promise((res,rej)=>{
            setTimeout(()=>{
                console.log("我是timer3");
                res('timer3成功后返回的内容');
            },1000)
        })
        return p;
    }
    
    // 单个调用
    timer1().then((data)=>{
        console.log(data);
    })
    
    // 连续调用
    timer1().then((data)=>{
        console.log(data);
        return timer2();
    }).then((data)=>{
        console.log(data);
        return timer3();
    }).then((data)=>{
        console.log(data);
    })
    
    //通过all方法调用 注意 这个方式是并行执行的 无法决定顺序
    Promise.all([timer1(), timer2(), timer3()]).then(function(results){
        console.log(results);
    });
    

    另外这里再介绍两个不太常用的东西:


    1.跟then相对的方法,是catch,也可以一个catch接着一个往下写,是一样的。

    2.然后all方法,是按照队列里面速度最慢的那个去执行的,
    他还有一个race方法,是谁速度快先执行谁,但是还是并行的,无法解决队列的问题。

    相关文章

      网友评论

        本文标题:ES6基础入门教程(十六)promise异步队列

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