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

介绍


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方法,是谁速度快先执行谁,但是还是并行的,无法解决队列的问题。

Copyright © 2023 | 粤ICP备14006518号-4

Proudly powered by WordPress | Theme: Beast Blog by Crimson Themes.