美文网首页
简单记录一下Promise的使用方法

简单记录一下Promise的使用方法

作者: wxw_威 | 来源:发表于2020-08-12 09:51 被阅读0次

Promise 作用

Promise意在让异步代码变得干净和直观,让异步代码变得井然有序。

Promise在设计上具有原子性,即只有三种状态:等待(Pending)、成功(Fulfilled)、失败(Rejected)。在调用支持Promise的异步方法时,逻辑变得非常简单,在大规模的软件工程开发中具有良好的健壮性。

(1)基本语法

创建Promise对象:
要想给一个函数赋予Promise能力,就要先创建一个Promise对象,并将其作为函数值返回。Promise对象要求传入一个函数,并带有resolve和reject参数。这是两个用于结束Promise等待的函数,对应的状态分别是成功和失败。

handleButton() {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          console.log('延迟执行')
          resolve({'code': '200'})
          // reject({'error': '404'})
        }, 2000);
      }).then((result) => {
        console.log('最后执行' + result.code)
      }).catch((error) => {
        console.log('执行失败' + error.error)
      })
    },

将新创建的Promise对象作为异步方法的返回值,所有的状态就可以使用它所提供的方法进行控制了。
进行异步操作:
创建了 Promise对象后,就可以进行异步操作,并通过resolve (value)和reject (reason)方法来控制Promise的原子状态。

resolve(value)方法控制的是当前Promise对象是否进入成功状态,一旦执行该方法并传入有且只有一个返回值,Promise便会从等待状态(Pending)进入成功状态(Fulfilled),Promise也不会再接收任何状态的变。
reject (reason)方法控制的是当前Promise对象是否进入失败阶段,与resolve方法相冋,一旦进入失败阶段就无法再改变。

其中在Promise的首层函数作用域中一旦出现throw语句,Promise对象便会直接进入失败状态,并以throw语句的抛出值作为错误值进行错误处理。

handleButton() {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          console.log('延迟执行')
          resolve('200')
          //throw new Error('error')        // 执行solve 方法,出现throw 语音,直接抛出异常,执行reject 方法
          // reject('404')
        }, 2000);
      }).then((result) => {
        console.log('最后执行' + result)
        //throw new Error('error')      // 执行solve 方法,出现throw 语音,直接抛出异常,执行reject 方法
      }).catch((error) => {
        console.log('错误执行' + error)
      })
    },

错误结果

延迟执行
最后执行200
错误执行Error: error

但是相对的return语句并不会使Promise对象进入成功状态,而会使Promise停留在等待状态。所以在Promise对象的执行器(executor)内需要谨慎使用return语句来控制代码流程。

(2)高级使用方法

Promise.all

Promise.all([f1, f2, f3])用于将多个promise实例,包装成一个新的Promise实例,返回的实例就是普通的promise
它接收一个数组作为参数
数组里可以是Promise对象,也可以是别的值,只有Promise会等待状态改变
当所有的子Promise都完成,该Promise完成,返回值是全部值得数组
有任何一个失败,该Promise失败,返回值是第一个失败的子Promise结果

    func1() {
      console.log('go func1')
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          // reject('func1')
          resolve('func1')
        }, 5000)
      })
    },
    func2() {
      console.log('go func2')
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          // resolve('func2')
          reject('func2')
        }, 3000)
      })
    },

    func3() {
      console.log('go func3')
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          // reject('func3')
          resolve('func3')
        }, 1000)
      })
    },

    handleAdd() {
      const promiseArray = [this.func1(), this.func2(), this.func3()]
      Promise.all(promiseArray)
        .then(res => {
          console.log('success:' + res)
        })
        .catch(error => {
          console.log('error:' + error)
        })
    },

执行结果

go func1
go func2
go func3
success:func1,func2,func3

如果func2() 方法执行reject ,执行结果如下:

go func1
go func2
go func3
error:func2
Promise.race()

顾名思义,Promse.race就是赛跑的意思,意思就是说,Promise.race([p1, p2, p3])里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态。

    handleAdd() {
      const promiseArray = [this.func1(), this.func2(), this.func3()]
      Promise.race(promiseArray)
        .then(res => {
          console.log('success:' + res)
        })
        .catch(error => {
          console.log('error:' + error)
        })
    }

执行结果

go func1
go func2
go func3
success:func3

相关文章

网友评论

      本文标题:简单记录一下Promise的使用方法

      本文链接:https://www.haomeiwen.com/subject/gdlpdktx.html