浅谈Promise

1.什么是promise

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。

Promise的出现主要是为了帮助我们解决回调地狱的问题,其本身也是一个构造函数。

创建一个promise实例

  let pro=new Promise((resolve,reject)=>{
            // 测试异步
            setTimeout(() => {
                console.log("第一");
                resolve('123')
            }, 1000);
     })
         console.log("第二");

其执行过程是:首先执行了一个同步操作输出“第二”,然后执行了一个异步操作,也就是setTimeout,2秒后,输出“第一”,并且调用resolve方法。

2.Promise的特点是什么?

Promise对象有以下两个特点。

(1)对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。

(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

什么时候状态为pending(进行中)

写一个promise的空实例对象

    let pro=new Promise((resolve,reject)=>{
             
     })
        console.log(pro);

可以看出promise的状态是pending

什么时候是 fulfilled(已成功)的状态?

  let pro=new Promise((resolve,reject)=>{
             resolve("promise状态为成功")
     })
        console.log(pro);

 可以看出promise的状态已经转化为fulfilled(成功状态了)并且PromiseResult的已经被赋值。

什么时候状态为失败呢?

  let pro=new Promise((resolve,reject)=>{
             reject("promise状态为失败")
     })
        console.log(pro);

可以看出promise的状态已经变为rejected(失败)

那么当promise的状态为fulfilled(成功)时我们能够做什么

  let pro = new Promise((resolve, reject) => {
            resolve("promise状态为成功")
        }).then((val) => {
            console.log(1);
            console.log(val);
        }).then(() => {
            console.log(2);
        }).then(val => {
            console.log(3);

        })
        console.log(pro);

可以看出当 promise的状态为fulfilled时候执行了.then方法,then方法是一个函数接受一个参数是接受resolve返回的数据这事就输出了‘要返回的数据可以任何数据例如接口返回数据’,并且then执行的是一个回调也是一个promise实例对象,并且then的参数已经成功赋值给了[[PromiseResult]]

那么当promise的状态为rejieted(失败)时?

  let pro = new Promise((resolve, reject) => {
            reject("promise状态为失败")
        }).then((val) => {
            console.log(1);
            console.log(val);
        }).then(() => {
            console.log(2);
        }).then(val => {
            console.log(3);

        }).catch(()=>{
             console.log("失败");
        })

在then的链式调用中只要有一个出现问题,后面的都不执行,而是执行了catch方法

catch方法的作用:1 捕获.then链式调用中的错误(状态为rejected)。2.处理 promise对象 的 已经拒绝的状态

then方法

then方法的作用就是1.当peomise的处理状态变为 已接受的状态时的方法2.获取p中[[PromiseResult]]的赋值3.实参二:处理 已拒绝状态的业务(不常用)

优势:支持链式调用

弊端:then 停不下来

  let p = new Promise((resolve,reject)=>{
            resolve(123)
            // reject()
        })

  let p1 =  p.then((res)=>{
            console.log(res);
            return '给p1.[[PromiseResult]]赋值'
        },()=>{
            console.log('reject');
        })
        console.log(p1);

从上面代码中可以看出 

then 回调函数的形参作用是什么?是获取p.[[PromiseResult]]的值

then的返回值是什么?是给[[PromiseResult]]赋值的。

then中回调函数的作用是什么?是当promise的状态为成功状态时,要执行的业务

then 回调函数return的作用是什么?是p.then() 的返回值

catch方法

与Promise对象方法then方法并行的一个方法就是catch,与try  catch类似,catch就是用来捕获异常的,也就是和then方法中接受的第二参数rejected的回调是一样的。

Promise.all方法

Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例对象

作用:

可以同时触发多个promise,用于处理并发任务, 等多个异步都结束的在执行下一个任务

 let p = new Promise((resolve,reject)=>{
            console.log('第一个异步任务开始了');
            setTimeout(() => {
                resolve('第一次异步结果')
            }, 1000);
        })
        let p2 = new Promise((resolve,reject)=>{
            console.log('第二个异步任务开始了');
            setTimeout(() => {
                resolve('第二次异步结果')
                // reject()
            }, 2000);
        })
        let p3 = new Promise((resolve,reject)=>{
            console.log('第三个异步任务开始');
            setTimeout(() => {
                resolve('第三次异步结果')
            }, 3000);
        })
  Promise.all([p,p2,p3]).then(arr=>{
            // arr 数组
            // 数组元素:对应的promise对象.[[PromiseResult]]
            console.log('三个异步都结束了');
            console.log(arr);
      
        }

可以看出当promise的状态为成功时全部调用了then方法

那么当promise中有一个状态为rejected时会发生什么?

 let p = new Promise((resolve,reject)=>{
            console.log('第一个异步任务开始了');
            setTimeout(() => {
                resolve('第一次异步结果')
            }, 1000);
        })
        let p2 = new Promise((resolve,reject)=>{
            console.log('第二个异步任务开始了');
            setTimeout(() => {
               
                reject(“状态失败啦”)
            }, 2000);
        })
        let p3 = new Promise((resolve,reject)=>{
            console.log('第三个异步任务开始');
            setTimeout(() => {
                resolve('第三次异步结果')
            }, 3000);
        })
  Promise.all([p,p2,p3]).then(arr=>{
            // arr 数组
            // 数组元素:对应的promise对象.[[PromiseResult]]
            console.log('三个异步都结束了');
            console.log(arr);
      
        }.catch(()=>{
               console.log("有一个失败了")
            })

 可以看出只有当三个实例对象都变为 已接受状态时候才会触发回调函数,从而给promiseResult成功赋值

p的状态由p2p3决定,分成两种情况。

(1)只有p2p3的状态都变成fulfilledp的状态才会变成fulfilled,此时p2p3的返回值组成一个数组,传递给p的回调函数。

(2)只要p2p3之中有一个被rejectedp的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

总结

promise 实例对象创建有几种方式

          1.1 new Promise

          1.2 then的返回值

          1.3 catch 的返回值

          1.4 finally 的返回值

          1.5 async 函数的返回值

  2: 更改promise状态有什么方式

           resolve()  fulfilled 已接受

           reject()  rejected  已拒绝

 3: [[PromiseResult]] 赋值有几种方式

           2.1 resolve reject的实参

           2.2 then 的return

           2.3 async 的return

 4: [[PromiseResult]] 取值有哪些方式

           4.1 then的回参

           4.2 await 返回值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值