Promise 对象介绍和核心API介绍

2022-01-21 0 By admin

Promise 是异步编程的一种解决方案;所谓Promise 简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。

  1. 从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。
  2. Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。

一、Promise 对象属性介绍

1.1、Promise对象的状态

Promise的状态其实是实例对象中的一个内置属性(PromiseState),不能够对该属性做直接的操作(对象的状态不受外界影响)。
Promise的三种状态:

  • pending:进行中、未定的状态
  • fullfilled/resolved:已成功
  • rejected:已失败

只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。

1.2、Promise的状态的改变

Promise 对象的状态改变,只有两种可能:

  • 从pending变为fulfilled;;pending->fulfilled
  • 从pending变为rejected;;pending->rejected

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

1.3、传递执行结果 promiseResult

Promise 包装的异步操作,无论执行成功或执行失败,都需要将执行结果传递给相应的回调函数进行处理;这里就需要使用到 promiseResult 属性了。
Promise 对象的值就是实例对象中的另外一个属性promiseResult,该值保存了异步任务成功/失败的结果,供then()方法的回调函数接受异步操作的执行结果。

二、Promise 对象中重要的API介绍

2.1、Promise 对象的构造函数

Promise 构造函数接受一个函数(执行器函数)作为参数,该函数的两个参数分别是resolve和reject。
它们是两个函数,由 JavaScript 引擎提供,不用自己部署。

  • Promise的构造函数:Promise(excutor){}
  • —-excutor函数:执行器(resolve,reject)=>{}
  • ——-resolve函数:内部定义成功时,调用的函数 value=>{}
  • ——-reject函数:内部定义失败时,调用的函数 reason=>{}

说明:executor 会在 promise 内部立即同步调用,异步操作在执行器中执行。

const promise = new Promise(function(resolve, reject) {
  // ... some code
  if (/* 异步操作成功 */){
    resolve(value);
  } else {
    reject(reason);
  }
});
  1. resolve函数:将Promise对象的状态从“pending”变为“resolved”;在异步操作成功时调用,并将异步操作的结果,作为参数value传递出去。
  2. reject函数:将Promise对象的状态从“pending”变为“rejected”;在异步操作失败时调用,并将异步操作报出的错误,作为参数error/reason传递出去。

Promise实例生成以后,可以用then()方法分别指定resolved状态和rejected状态的回调函数。

2.2、Promise 绑定回调函数 then()方法

Promise 实例生成以后,可以用then()方法分别指定resolved状态和rejected状态的回调函数。
then方法可以接受两个回调函数作为参数。

  1. 第一个回调函数onResolved()是Promise对象的状态变为resolved时调用
  2. 第二个回调函数onRejected()是Promise对象的状态变为rejected时调用
  3. 这两个函数都是可选的,不一定要提供。它们都接受Promise对象传出的值作为参数

Promise.prototype.then 方法形式:

promise.then(function(value) {
  //onResolved函数:成功的回调函数(value)=>{}
}, function(reason) {
  //onRejected函数:失败的回调函数(reason)=>{}
});

Promise 封装异步操作的常规用法示例:

// 创建一个新的p对象promise
const p = new Promise((resolve, reject) => { // 执行器函数
  // 执行异步操作任务
  setTimeout(() => {
    const time = Date.now() 
    // 如果当前时间是偶数代表成功,否则失败
    if (time % 2 == 0) {
      // 如果成功,调用resolve(value)
      resolve('成功的数据,time=' + time)
    } else {
      // 如果失败,调用reject(reason)
      reject('失败的数据,time=' + time)
    }
  }, 1000);
})
// 绑定回调函数
p.then(
  value => { // 接收得到成功的value数据 onResolved
    console.log('成功的回调', value)  // 成功的回调 成功的数据,time=1615015043258
  },
  reason => { // 接收得到失败的reason数据 onRejected
    console.log('失败的回调', reason)    // 失败的回调 失败的数据,time=1615014995315
  }
)
  1. .then() 和执行器(executor)同步执行。
  2. .then() 中的回调函数异步执行。

2.3、Promise 只绑定失败的回调函数 catch()方法

Promise.prototype.catch 方法: (onRejected) => {}。
只绑定失败状态的回调函数;相当于 then()方法定义为 then(undefined, onRejected)