-
Promise
是一个对象,它代表了一个异步操作的最终完成(或者失败)及其结果值。 -
三个状态:
- 待定(pending):初始状态,既没有被兑现,也没有被拒绝;
- 已兑现(fulfilled):意味着操作成功完成;
- 已拒绝(rejected):意味着操作失败。
- 待定状态的Promise对象要么会以一个值被兑现,要么会以一个原因被拒绝。
-
属性
- Promise.length:其值总是1;
- Promise.prototype:Promise构造器的原型
-
方法
- Promise.all():返回一个新的Promise对象,只有在参数对象里所有的Promise对象都成功的时候才会触发成功。成功时:并将返回值的数组作为成功回调的返回值,顺序与参数对象的顺序一致;若失败:则会把第一个触发失败的Promise对象的错误信息作为它的失败错误信息。常被用于处理多个promise对象的状态集合。
- Promise.allSettled():等到所有Promise都完成(每个promise返回成功或失败),返回一个promise,该promise在所有promise完成后完成,并带有一个对象数组,每个对象对应每个promise的结果。
- Promise.any():其中一个成功就返回,返回那个成功的promise的值。
- Promise.race():任意一个子promise成功或失败后,父promise也会用子promise的成功或失败作为参数调用,并返回该promise对象。
- Promise.reject(reason):返回一个失败状态的promise对象,并将给定的失败信息传递给对于的处理方法
- Promise.resolve(value):返回一个由value决定的promise对象。
-
怎样使用Promise?
- 约定:
- 在本轮事件循环运行完成之前,回调函数是不会被调用的;
- 即使异步操作已经完成(成功/失败),在这之后通过then()添加的回调函数也会被调用;
- 通过多次调用then()可以添加多个回调函数,它们按照插入顺序进行执行。
- 链式调用:
- Promise.then()
- Promise.catch()
- Promise.finally()
- 连续执行两个或多个异步操作。
- 在过去,若想做多重的异步操作,会导致回调地狱;而使用promise则可以解决这个问题,形成一个Promise链。
- 通过捕获所有的错误,甚至抛出异常和程序错误,Promise 解决了回调地狱的基本缺陷。
- 组合
- Promise.all()
- Promise.race()
- 使用async/await时序组合
let result; for (const f of [func1, func2, func3]) { result = await f(result); }
- 时序:为了避免意外,即使是一个已经变成resolve状态的promise,传递给then()的函数也总是会被异步调用。
Promise.resolve().then(()=>console.log(2)); console.log(1); //1,2
- 约定:
-
如何创建Promise?
- Promise对象是由关键字new及其构造函数来创建的;
- 该构造函数接收一个“处理器函数”作为参数;
- “处理器函数”接收两个函数(resolve、reject)作为参数;
- 当异步任务顺利完成且返回结果值时,会调用resolve函数;
- 当异步任务失败且返回失败原因时,会调用reject函数。
const fn = new Promise((resolve,reject)=>{ resolve(); reject(); })
扩展阅读:
1.超全面试题
2.手写Promise
3.手写Promise2