谈谈自己所理解的promise

哎,自己的学习能力还是弱了些。
所以去年的时候,在腾讯课堂上买过一个关于promise的课程。当时了解了用法,但是平时并没有去使用promise来进行异步流程控制。

首先来说说什么是promise?
promise就是ES6推出的解决异步流程的一个方案。用来避免Callback Hell。
比如说,我们最为常见的异步场景就是ajax。还记得xhr对象里面open()的第三个参数么? 没错,就是true,false。 用来选择异步/同步。
但是我们有时候会想在获取第一个数据后,再去发起第二个ajax请求(因为我们可能要用到第一个ajax的response)。那么,我们通常的办法就是callback。
上一段jq的代码吧

$.ajax({
    url: '......',
    success: function (data) {
        $.ajax({
            // 要在第一个请求成功后才可以执行下一步
            url: '......',
            success: function (data) {
                 // ......
            }
        });
    }
});

所以为了解决这个问题,社区推出了promise的方案并被ES6采纳。
当然node7.6已经支持ES7了,ES7采用的是async await的解决方案,这个先暂且不谈。

promise英文意思是承诺,有三个状态:

  • pending 未完成呢!
  • resolve ok! Victory! 成功了
  • reject I’m so so so sorry! 没干成

promise是一个对象,要return new Promise(res, rej)才能去使用.then()和.catch()方法。
其中then()代表成功之后干的事儿。
而catch()代表失败之后干的事儿。

另外值得说明的是,then()里面其实可以放两个function的,第二个function相当于catch。 不过这样看着没catch清晰啊

另外需要说明的就是参数的传递

function promise(){
    return new Promise((resolve, reject) => {
        resolve('haha')
    }).then(function(data){
        console.log(data);
        return data + 'heihei';
    }).then(function(data){
        console.log(data);
    })
}
// haha
// hahaheihei

从上面的demo可以看出,resolve()里面的数据可以直接抛过来,但是在链式操作的时候,我们需要return data。

另外一点是,我们可以针对不同的情况来选择是resolve还是reject,比如说

function promise(){
    return new Promise((resolve, reject) => {
        if(10%2){
            resolve();
        }else{
            reject();
        }
    }).then(function(){
        console.log('真淘气');
    }).catch(function(){
        console.log('顽皮');
    })
}
// 顽皮

当然,上面的代码的判断地方可以改写为三元判断符。

另外两个常用的promise方法是promise.all()和promise.race()
这两个方法都是接受一个由promise对象组成的数组作为参数
顾名思义,第一个是all,全部的,也就是说数组里的每一个promise都完成了resolve,那么才算成功,才会走then。
而第二个是race,就竞赛的意思,那么也就是说当数组里只要有一个promise对象完成了resolve(), 那么它就会往下执行了。

这让我想起来的一个面试题,等明天的时候放上来吧。

更新:
http://blog.csdn.net/qq_35534823/article/details/71520627

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值