Promise

Promise 承诺

Promise是一个承诺,并不会立即执行
resolve是兑现承诺的回调,reject是拒绝兑现的回调
我们可以用then来获取兑现结果,用catch回去拒绝兑现的原因比如

function bigHouse(){
    return new Promise(function(resolve,reject){
        setTimeout(function(){
            var n = Math.random();//生成随机数
            if(n>0.5){ //数字大于0.5兑现承诺
                reselve("兑现承诺")
            }else{
                reject("未能兑现承诺")
            }
        },2000)
    })
}

bigHouse().then(res=>{
    console.log(res)
}).catch(err=>{
    console.log(err)
})

使用Promise有什么好处呢?比如我们现在要做这么一个需求,在2s后控制台输出第一句话之后等待3.5s后输出第二句话,然后再等1.5s后输出第三句话如果使用一般的函数方法来实现的话代码如下

function say(msg,time,callback){
    setTimeout(function(){
        console.log(msg);
        if(callback){
            callback();
        }
        
    },time)
}

say("第一句话",2000,function(){
    say("第二句话",3500,function(){
        say("第三句话",1500)
    })
})

这样看起来还好,但是如果需求更多的话嵌套层数过多就会导致代码看起来变复杂了,而使用Promise的话就不需要嵌套了,下面是Promise的写法

function say(msg,time){
    return new Promise(function(resolve,reject){
        setTimeout(function(){
            resolve(msg)
        },time)
    })
}

say("第一句话",2000).then(res=>{
    console.log(res);
    return say("第二句话",3500)
}).then(res=>{
    console.log(res);
    return say("第三句话",1500)
}).then(res=>{
    console.log(res)
})

看起来好像变复杂了,但是这样没有了嵌套,即使需求变多代码看起来条理依旧清晰

.race

Promise有一个.race方法,这个方法可以只执行多个Promise中最先完成的哪一个,比如

var pics = [
    "https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/7bc54a61b927dd8c54ddd39a0acf0254.jpg?w=632&h=340",
    "https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/94c74e01afe50a86c3a87ff030b85781.jpg?w=632&h=340",
    "https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/816a66edef10673b4768128b41804cae.jpg?w=632&h=340"
]
//这里有三张图片,我们只想在页面上显示最先加载完的那一张图片,就可以使用.race方法
function loadImage(url){
    return new Promise((resolve,reject)=>{
        var img = document.createElement("img");
        img.src = url;
        img.onload = function(){
            reslove(img);
        }
        img.onerror = function(e){
            reject(e)
        }
    })
}

Promise.race([loadImage(pics[0]),loadImage(pics[1]),loadImage(pics[2])])
.then(res=>{
    var div = document.createElement("div")
    div.innerHTML = "赛跑"
    document.body.append(div)
    document.body.append(res)
})

.all

当我们需要在三张图片全部加载完毕时同时让它们渲染在页面上可以用.all方法

Promise.all([loadImage(pics[0]),loadImage(pics[1]),loadImage(pics[2])])
.then(res=>{
    var div = document.createElement("div");
    div.innerHTML = "全部出现";
    document.body.append(div)
    for(var img in res){
        document.body.append(res[img])
    }
})
  • 1
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大阪黑鸡

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值