promise的简单介绍

1. promise是什么?

promise是解决异步问题的一种解决方案(但是它本身不是异步的),它本质上是一个对象,用于获取异步的一些消息。
promise有三种状态: pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行。

你可以找到更多关于的信息 LaTeX 数学表达式[here][1].

2.promise的特点

2.1 promise的三种状态

一个 Promise 必然处于以下3种状态之一:

待定状态(pending): 初始状态,不是成功状态也不是失败状态。
成功状态(fulfilled):  意味着操作成功完成。
失败状态(rejected): 意味着操作失败。

2.2 状态改变情况

当promise状态从pending,变成其他两种状态中的一种时,就不会再变,任何时候都可以得到这个结果。所以,Promise 对象的状态改变,只有两种可能:从 pending 变为 fulfilled 和从 pending 变为 rejected。

3.promise语法

基本语法

 var promise = new Promise(function(resolve, reject) {
		// 异步语句
		// 异步语句执行结束后、调用resolve 或 reject
});

Promise 对象的创建语法中,包含一个参数和一个带有 resolve(解析)和 reject(拒绝)两个参数的回调。
在回调中执行一些操作(例如异步),如果成功,则调用 resolve,它把promise的状态修改为fullfiled。失败则调用 reject,,他把promise的状态修改为rejected。

4.一些基本用法

4.1 then 的用法

链式操作,简化层层回调的写法。

  const pro = new Promise((resolve, reject) => {
            setTimeout(function(){
                var num = Math.ceil(Math.random()*10); //生成1-10的随机数
                resolve(num);
      }, 1000);
           
        })
        pro.then(function(data){
            console.log('随机数字是'+data);
            return data*2
        }).then(function(data1){
            console.log('第一个数字的两倍是'+data1);
            return data1*2
        }).then(function(data2){
            console.log('第二个数字的两倍是'+data2);
            return data2*2
        }).then(function(data3){
            console.log('第三个数字的两倍是'+data3);
        });


利用定时器异步获取一个数字,1秒后执行完成。第一个then接收传过来的数字,然后输出,并对该数据进行乘2的处理,接着传给下一个then,依次执行上述操作。就得到了下面的运行结果。
运行结果如下:

在这里插入图片描述

4.2 reject的用法

reject的作用就是把Promise的状态置为rejected,这样我们在then中就能捕捉到,然后执行“失败”情况的回调。看下面的代码。

下面举一个简单的例子,当小花手中的苹果数大于5时,就不送人,如果小于大于5,就把苹果送给小红。小花手中的苹果数是随机的。

const pro1 = new Promise((resolve, reject) => {
            var num = Math.ceil(Math.random()*10); //生成1-10的随机数
            console.log('小花有'+num+'个苹果');
            if(num<=5){
                resolve(num);
            }
            else{
                reject(num);
            }
        })

        const pro2 = pro1.then(data => {
            console.log('小花送给小红'+data+'个苹果');
        }, err => {
            console.log(err+'个苹果,太重了,拿不起,不送了');
        })

利用定时器异步获取一个数字,1秒后执行完成,如果数字小于等于5,我们认为是“成功”了,调用resolve修改Promise的状态。否则我们认为是“失败”了,调用reject并传递一个参数,作为失败的原因。
结果1
在这里插入图片描述

结果2
在这里插入图片描述

4.3 catch的用法

在执行resolve的回调(也就是上面then中的第一个参数)时,如果抛出异常了(代码出错了),那么并不会报错卡死js,而是会进到这个catch方法中。

还有一个作用是用来指定reject的回调。

 const pro = new Promise((resolve, reject) => {
            var num = Math.ceil(Math.random()*10); //生成1-10的随机数
            console.log(num);
            if(num<=5){
                resolve(num);//成功
            }
            else{
                reject(num);//失败
            }
        })
       
        pro.then(function(data){
            console.log('resolved'+num);
            console.log(data);
        })
        .catch(function(reason){
            console.log('rejected'+num);
            console.log(reason);
        });

如果数字小于等于5,我们认为是“成功”了,调用resolve修改Promise的状态,并进到这个then方法中。否则我们认为是“失败”了,调用reject并传递一个参数,作为失败的原因,并进到这个catch方法中。
结果1
在这里插入图片描述
结果2
在这里插入图片描述

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值