Promise的基本使用

通过一个例子引出Promise对象

**提出一个需求:**投一个硬币,如果是正面的时候,提出表扬,如果是反面的时候,提出批评
**分析:**条件:1.正面 2.反面
由于提出表扬和惩罚都是投硬币的结果出来之后,表扬和惩罚有一个等待的过程,因此是异步的,奖励和惩罚提出来后不马上执行,需要投硬币的结果出来之后再执行
下面用定时函数描述异步
代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<script>
	   //李白投一个硬币,如果是正面的时候,提出表扬,如果是反面的时候,提出批评		
        setTimeout(() => {
            //结果为正面
                    var res1 ="resultTrue";
                    //结果为反面
                    var res2 ="resultFalse";
                    //假设的结果
                    var res = res1;
                    if(res === "resultTrue"){
                console.log("表扬")
            }else{
                console.log("惩罚")
            }   
        },2000)
    </script>
</body>
</html>

当李白投掷的硬币的结果为正面的时候,打印以下结果:
在这里插入图片描述
假设不只有李白一个人投硬币,杜铺也投。
代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        //李白投一个硬币,如果是正面的时候,提出表扬,如果是反面的时候,提出批评
        setTimeout(() => {
             //结果为正面
                    var res1 ="resultTrue";
                    //结果为反面
                    var res2 ="resultFalse";
                    //假设的结果
                    var res = res1;
                    if(res === "resultTrue"){
                console.log("表扬冰棍")
            }else{
                console.log("惩罚跑步")
            }   
        },2000)
        //杜铺投一个硬币,如果是正面的时候,提出表扬,如果是反面的时候,提出批评
        setTimeout(() => {
            //结果为正面
                    var res1 ="resultTrue";
                    //结果为反面
                    var res2 ="resultFalse";
                    //假设的结果
                    var res = res1;
                    if(res === "resultTrue"){
                console.log("表扬糖果")
            }else{
                console.log("惩罚站立")
            }   
        },2000)
    </script>
</body>
</html>

如果还有10个诗人也参与投硬币,那么还有就还要写10个定时函数。针对这种情况可以考虑封装。封装就是把代码可变的部分封装起来,对比李白和杜铺两个定时函数,他们惩罚和奖励的结果是不一样的。所以可以把输出的结果抽出来封装。

创建一个诗人硬币的一个函数,该函数会结果两个不一样的结果,一个是惩罚,一个是表扬
代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>

        //提出一个需求:李白投一个硬币,如果是正面的时候,提出表扬,如果是反面的时候,提出批评
        //分析:条件:1.正面 2.反面
        //由于提出表扬和惩罚都是投硬币的结果出来之后,表扬和惩罚有一个等待的过程,因此是异步的
        //奖励和惩罚提出来后不马上执行,需要投硬币的结果出来之后再执行
        //下面用定时函数描述异步
        //李白投一个硬币,如果是正面的时候,提出表扬,如果是反面的时候,提出批评
        setTimeout(() => {
            //结果为正面
                    var res1 ="resultTrue";
                    //结果为反面
                    var res2 ="resultFalse";
                    //假设的结果
                    var res = res1;
                    if(res === "resultTrue"){
                console.log("表扬冰棍")
            }else{
                console.log("惩罚跑步")
            }   
        },2000)

        //杜铺投一个硬币,如果是正面的时候,提出表扬,如果是反面的时候,提出批评
        setTimeout(() => {
            //结果为正面
                    var res1 ="resultTrue";
                    //结果为反面
                    var res2 ="resultFalse";
                    //假设的结果
                    var res = res1;
                    if(res === "resultTrue"){
                console.log("表扬糖果")
            }else{
                console.log("惩罚站立")
            }   
        },2000)

        //创建一个诗人硬币的一个函数,该函数会结果两个不一样的结果,一个是惩罚,一个是表扬
        function test(){
                setTimeout(() => {
                //结果为正面
                    var res1 ="resultTrue";
                    //结果为反面
                    var res2 ="resultFalse";
                    //假设的结果
                    var res = res1;
                    if(res === "resultTrue"){
                    console.log("表扬糖果")
                }else{
                    console.log("惩罚站立")
                }   
            },2000)
        }
    </script>
</body>
</html>

哪个诗人投硬币,哪个诗人就调用test()这个函数,只有每个诗人正反面对应的结果不一样。因此对应的结果应该是传进来的。

在函数test声明两个函数作为参数,第一个参数是resolve,是解决的意思,在这里代表的是你投硬币的结果为正面时候处理的方法,第二个参数是reject,是拒绝的意思,在这里代表的是你投硬币的结果为反面时候处理的方法。

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>

        //创建一个诗人硬币的一个函数,该函数会结果两个不一样的结果,一个是惩罚,一个是表扬
        function test(resolve,reject){
                setTimeout(() => {
                    //结果为正面
                    var res1 ="resultTrue";
                    //结果为反面
                    var res2 ="resultFalse";
                    //假设的结果
                    var res = res1;
                    if(res === "resultTrue"){
                        // console.log("表扬糖果")
                        resolve();
                    }else{
                        // console.log("惩罚站立")
                        reject();
                    }   
            },2000)
        }

    </script>
</body>
</html>

先假设李白先投掷硬币。
给test传入函数作为参数。第一个参数代表是正面,第二个参数代表是反面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
//创建一个诗人硬币的一个函数,该函数会结果两个不一样的结果,一个是惩罚,一个是表扬
        function test(resolve,reject){
                setTimeout(() => {
                    //结果为正面
                    var res1 ="resultTrue";
                    //结果为反面
                    var res2 ="resultFalse";
                    //假设的结果
                    var res = res1;
                    if(res === "resultTrue"){
                        // console.log("表扬糖果")
                        resolve();
                    }else{
                        // console.log("惩罚站立")
                        reject();
                    }   
            },2000)
        }

        //先假设李白先投掷硬币。
        test(function(){
            console.log("表扬冰棍")
        },function(){
            console.log("惩罚跑步")
        })

    </script>
</body>
</html>

运行两秒后显示结果:
在这里插入图片描述
从这个例子中可以看出,函数test封装后可以接受两个回调函数,这个是李白投掷硬币,如果是杜铺投掷硬币的时候,直接调用函数test,给它传两个参数就可以了。
代码如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
//创建一个诗人硬币的一个函数,该函数会结果两个不一样的结果,一个是惩罚,一个是表扬
        function test(resolve,reject){
                setTimeout(() => {
                    //结果为正面
                    var res1 ="resultTrue";
                    //结果为反面
                    var res2 ="resultFalse";
                    //假设的结果
                    var res = res1;
                    if(res === "resultTrue"){
                        // console.log("表扬糖果")
                        resolve();
                    }else{
                        // console.log("惩罚站立")
                        reject();
                    }   
            },2000)
        }

        //李白投掷硬币。
        test(function(){
            console.log("表扬冰棍")
        },function(){
            console.log("惩罚跑步")
        })

        //杜铺投掷硬币。
        test(function(){
            console.log("表扬糖果")
        },function(){
            console.log("惩罚站立")
        })


    </script>
</body>
</html>

往后如果是其他的诗人投掷硬币,直接调用test函数,传两个对应的函数作为参数就可以了。

但是这个封装test的方法有一个非常大的缺陷,如果把resolve和reject的注释去掉,或者test函数里面不只有两个参数,或者两个参数不一定是函数,可能是变量等等

function test(resolve,reject,a,b,c){
                setTimeout(() => {
                    //结果为正面
                    var res1 ="resultTrue";
                    //结果为反面
                    var res2 ="resultFalse";
                    //假设的结果
                    var res = res1;
                    if(res === "resultTrue"){
                        // console.log("表扬糖果")
                        resolve();
                    }else{
                        // console.log("惩罚站立")
                        reject();
                    }   
            },2000)
        }

如果这种代码没有注释给别人看,是看不懂的。不知道这些参数代表什么意思。这代码很难维护。
因此,针对这种情况,提出了Promise对象,Promise对象是一个构造函数,返回一个promise对象,是es6标准下的一个对象,专门实现异步的需求,异步的情况下可以考虑用,不一定要用。

因此,针对这种情况,可以使用es6下的Promise对象,Promise对象是一个构造函数,返回一个promise对象,是es6标准下的一个对象,专门实现异步的需求。
标准写法:

//Promise是一个构造函数,返回一个promise对象,是es6标准下的对象,实现异步的需求
        //resolve是成功的回调函数
        //reject是失败的回调函数
        var pro = new Promise((resolve,reject) => {
            
        })

Promise这个函数里面默认有两个参数resolve,reject。(参数可以改名字),resolve代表成功的回调函数,reject代表的是失败的回调的函数。由于Promise对象的写法是固定的,即使不用注意也能知道这两个参数是什么意思

使用Promise使用诗人投硬币的方法
代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
//Promise是一个构造函数,返回一个promise对象,是es6标准下的对象,实现异步的需求
        //resolve是成功的回调函数
        //reject是失败的回调函数
        var pro = new Promise((resolve,reject) => {
            setTimeout(() => {
                    //结果为正面
                    var res1 ="resultTrue";
                    //结果为反面
                    var res2 ="resultFalse";
                    //假设的结果
                    var res = res1;
                    if(res === "resultTrue"){
                        // console.log("表扬糖果")
                        resolve();
                    }else{
                        // console.log("惩罚站立")
                        reject();
                    }   
                },2000)
        })
    </script>
</body>
</html>

这样代码是还没有执行的,只是把诗人投硬币的结果创建出来,因为promise是一个对象,要执行,需要两个方法 pro.then().catch() ,其中 .then() 代表成功的意思 。方法里面传的是一个成功的回调函数。
把pro当作axios。

如果投掷硬币是正面,表扬冰棍。如果投掷硬币是反面,惩罚跑步。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        //Promise是一个构造函数,返回一个promise对象,是es6标准下的对象,实现异步的需求
        //resolve是成功的回调函数
        //reject是失败的回调函数
        var pro = new Promise((resolve,reject) => {
            setTimeout(() => {
                    //结果为正面
                    var res1 ="resultTrue";
                    //结果为反面
                    var res2 ="resultFalse";
                    //假设的结果
                    var res = res1;
                    if(res === "resultTrue"){
                        // console.log("表扬糖果")
                        resolve();
                    }else{
                        // console.log("惩罚站立")
                        reject();
                    }   
                },2000)
        })

        //pro当做axios
        pro.then(() => {
            console.log("表扬糖果")
        })
    </script>
</body>
</html>

在这里插入图片描述
运行代码:
在这里插入图片描述
修改投掷的结果为正面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
// Promise是一个构造函数,返回一个promise对象,是es6标准下的对象,实现异步的需求
        // resolve是成功的回调函数
        // reject是失败的回调函数
        var pro = new Promise((resolve,reject) => {
            setTimeout(() => {
                    //结果为正面
                    var res1 ="resultTrue";
                    //结果为反面
                    var res2 ="resultFalse";
                    //假设的结果
                    var res = res1;

                    if(res === "resultFalse"){
                        // console.log("表扬糖果")
                        resolve();
                    }else{
                        // console.log("惩罚站立")
                        reject();
                    }   
                },2000)
        })

        //pro当做axios
        pro.then(() => {
            console.log("表扬糖果")
        })
    </script>
</body>
</html>

运行代码:
在这里插入图片描述
由于方法里面没有传一个失败情况的回调函数。因此报错,也可以看出。pro的回调函数是resolve。为了当你投掷硬币的结果为反面的时候,显示结果,给pro传一个失败的回调函数catch,表示失败的回调函数。

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        // Promise是一个构造函数,返回一个promise对象,是es6标准下的对象,实现异步的需求
        // resolve是成功的回调函数
        // reject是失败的回调函数
        var pro = new Promise((resolve,reject) => {
            setTimeout(() => {
                    //结果为正面
                    var res1 ="resultTrue";
                    //结果为反面
                    var res2 ="resultFalse";
                    //假设的结果
                    var res = res1;

                    if(res === "resultFalse"){
                        // console.log("表扬糖果")
                        resolve();
                    }else{
                        // console.log("惩罚站立")
                        reject();
                    }   
                },2000)
        })

        //pro当做axios
        pro.then(() => {
            console.log("表扬糖果")
        }).catch(() => {
            console.log("惩罚站立")
        })
    </script>
</body>
</html>

在这里插入图片描述
运行结果:
在这里插入图片描述
对比与之前的实现方式。Promise的实现方式, then和catch两个回调函数一看就知道then就代表成功的情况,catch代表的是失败的情况。阅读性更好!

由于这个方法只是能满足单个人投硬币使用,不能满足多个人。因此需求还没有完成。我们要的是多个人投硬币,都可以进行判断出结果。要完成这个需求,我们还要引入async和await。
async是异步的意思,await是等待的意思。这篇文章写的太长了,这个需求要到下一篇关于
async和await的文章一起完成。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值