用户登录
用户注册

分享至

ES6中的promise

  • 作者: mr隔壁老王
  • 来源: 51数据库
  • 2021-09-01

promise是异步编程的一种解决方法

Promise对象的特点:

一、对象的状态不受外界的影响,Promise有三种状态:Pending(进行中)、fulfilled(已成功)、rejected(失败),只用异步操作的结果可以决定当前是哪一种状态,其他任何操作都无法改变这个操作。
二、一旦状态改变之后就不会再改变。任何时候都可以得到这个结果。状态变化只有两种可能:从pending到fulfilled和从pending到rejected。只要改变就已经定型了。

promise对象的用法

promise.prototype的原型上有then和catch方法

promise.then()用法

Promise实例生成以后, 可以用then方法分别指定Resolved状态和Reject状态的回调函数。
then方法可以接受两个回调函数作为参数。
第一个回调函数是Promise对象的状态变为Resolved时调用, 第二个回调函数是Promise对象的状态变为Reject时调用。
其中, 第二个函数是可选的, 不一定要提供。

promise.catch()用法

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

  const test = new Promise((resolve, reject) => {
          resolve(1)
      })
      test.then(data => {
          console.log(data);//1
          throw ('mistake')
      }).catch(err => {
          console.log(err); //mistake
          //当抛出异常时,会在catch方法中捕捉到这个异常
      })

promise对象是构造函数本身携带的常用方法

promise.resolve(),promise.reject()用法

resolve函数的作用 : 将Promise对象的状态从’未完成’变为’成功’,在异步操作成功时调用,并将异步操作的结果作为参数传递出去
reject函数的作用:将Promise对象的状态从’未完成’变为’失败’,在异步操作失败时调用,并将异步操报出的错误作为参数传递出去

const p = new Promise((resolve, reject) => {
            const random = Math.random();
          if (random > 0.5) {
                resolve(random + '大于0.5');
            } else {
                reject(random + '小于0.5')
            }
        })
     const reslut = p.then(data => {
            console.log(data)//当随机数大于0.5 结果会传入data里面
            return data
        }, err => {
            console.log(err)//当随机输小于0.5时,结果会传入err里面
            return err
        })
     console.log(result)


Promise.all()用法
Promise.all方法用于将多个Promise实例包装成一个新的Promise实例.
all接收一个数组参数,里面的值最终都算返回Promise对象。
三个异步操作同时执行,执行完后,就会进入到then。
all会把所有异步操作的结果放在一个数组里传给then

    function test1() {
            const p = new Promise((resolve, reject) => {
                setTimeout(() => {
                    console.log('测试一完成');
                    resolve('test1')
                }, 3000)
            })
            return p
        }

        function test2() {
            const p = new Promise((resolve, reject) => {
                setTimeout(() => {
                    console.log('测试二完成');
                    resolve('test2')
                }, 3000)
            })
            return p
        }

        function test3() {
            const p = new Promise((resolve, reject) => {
                setTimeout(() => {
                    console.log('测试三完成');
                    resolve('test3')
                }, 3000)
            })
            return p
        }
  Promise.all([test1(), test2(), test3()]).then(datas => {
            console.log(datas)

        })


promise.race()用法
race()方法与all()方法类似,不同的是race()方法谁运行的最快,则以谁为基准,返回执行最快的那个结果。
我们把上面test1,test2,test3中setTimeout的延时分别改为3000,2000,4000,调用race()方法

 Promise.race([test1(), test2(), test3()]).then(datas => {
            console.log(datas)

        })
       


从控制台输出可以看到test2的延时最短,race()方法只返回了最快的那一个结果

软件
前端设计
程序设计
Java相关