Promise用法详解

什么是Promise呢?

 首先我们先看一个例子

<script>
        // 1.封装异步函数 5.给这个封装函数传入三个形参
        function getFood(count,successCallback,errCallback){
            // 3.声明一个定时器 来模拟异步操作
            setTimeout(()=>{
                // 6.判断这个标识符 成功执行这个函数
                if(count>0){
                    let name = "张三";
                    let num = 0;
                    for(let i = 0;i<100;i++){
                        num++;
                    }
                    successCallback(num);
                }else{
                    // 失败执行这个
                    errCallback("无了");
                }
            },3000);
        };
        // 2.调用这个函数 4.给这个函数传入三个实参 一个是标识符 一个成功函数 一个失败函数
        getFood(-1,(value)=>{
            console.log("这是一个成功的函数",value);
        },(err)=>{
            console.log("这是一个失败的函数",err);
        });
        // 在ES5之前我们都是这样解决异步处理问题 逻辑没有问题 也能实现这个操作
        // 但是每个人封装的函数都是不一样的 有的人喜欢把成功的实参函数写在前面、中间或者后面
        // 实参位置与相对应 形参位置不一致 可能形参成功函数位置对应实参失败的位置 所以造成了很多麻烦
        // 而我们要学的promise就是一个标准 来解决这样问题
    </script>

在上面的解决方案中,我们确确实实可以解决请求函数得到结果之后,获取到对应的回调,但是它存在两个主要的问题: 

第一,我们需要自己来设计回调函数、回调函数的名称、回调函数的使用等;

第二,对于不同的人、不同的框架设计出来的方案是不同的,那么我们必须耐心去看别人的源码或者文档,以便可以理解它 这个函数到底怎么用; 

在ES5之前我们都是这样解决异步处理问题 逻辑没有问题 也能实现这个操作

但是每个人封装的函数都是不一样的 有的人喜欢把成功的实参函数写在前面、中间或者后面

实参位置与相对应 形参位置不一致 可能形参成功函数位置对应实参失败的位置 所以造成了很多麻烦

而我们要学的promise就是这样一个标准

Promise 对象用于表示一个异步操作的最终完成(或失败)及其结果值。


我们来看一下Promise的API是怎么样的:

Promise是一个类,可以翻译成 承诺、许诺 、期约;

当我们需要的时候,给予调用者一个承诺:待会儿我会给你回调数据时,就可以创建一个Promise的对象;

在通过new创建Promise对象时,我们需要传入一个回调函数,我们称之为executor 

这个回调函数会被立即执行,并且给传入另外两个回调函数resolve、reject; 

当我们调用resolve回调函数时,会执行Promise对象的then方法传入的回调函数;

当我们调用reject回调函数时,会执行Promise对象的catch方法传入的回调函数;


Promise的代码结构

上面Promise使用过程,我们可以将它划分成三个状态:

待定(pending): 初始状态,既没有被兑现,也没有被拒绝;当执行executor中的代码时,处于该状态; 

已兑现(fulfilled): 意味着操作成功完成; 执行了resolve时,处于该状态,Promise已经被兑现;

已拒绝(rejected): 意味着操作失败;执行了reject时,处于该状态,Promise已经被拒绝

 <script>
        // 封装一个异步请求任务
        // 1.封装函数  4.写入形参
        function getFood(){
            // 5. 实例promise对象   这个对象里面是立即执行函数 两个参数 resolve reject
            const promise = new Promise((resolve,reject)=>{
                let name = "张三";  // 待定状态 
                let age = 17;  // 待定状态 
                console.log("我是待定状态");  // 待定状态 
                if(age >= 18){
                    // 已兑现 状态
                    resolve("我是一个成年人");
                }else{
                    // 已拒绝 状态
                    reject("我是一个小朋友");
                };
            });
            promise.then((value)=>{
                 console.log("你今年多大了?",value);
             });
            promise.catch((err)=>{
                 console.log("你今年多大了?",err);
             })
        };
        // 2.调用这个函数  3.给这个函数传入实参
        getFood();
    </script>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值