Promise对象用于表示一个异步操作的最终状态(完成或失败),以及该异步操作的结果值。
Promise是为了解决代码的嵌套问题。
有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。
Promise里的内容会立即执行。
只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。
const promise = new Promise((resolve, reject) => { if (/* 异步操作成功 */) { resolve(value); } else { reject(error); } })
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。
也可以使用.then.catch.finally进行处理:
const promise = new Promise((resolve, reject) => { // 发起异步请求 if (/* 异步操作成功 */) { resolve(value); // resolve对应.then方法 } else { reject(error); // reject对应.then方法的第二个参数,和.catch方法 } }); promise.then((data) => { console.log("这是resolve过来的") }, (err) => { console.log("这是reject过来的") }) promise.catch((err) => { console.log("这是reject过来的") }) promise.finally(() => { console.log("不管咋地都会执行我") })
Promise.all的使用:
const promise1 = new Promise((resolve, reject) => { // 像上面一样进行异步操作然后触发resolve和reject }); const promise2 = new Promise((resolve, reject) => { // 像上面一样进行异步操作然后触发resolve和reject }); Promise.all([promise1, promise2]) .then(([data1, data2]) => // 全部成功进行处理) .catch(([err1, err2]) => // 有任意一个失败进行处理) .finally(() => // 无论如何都会执行)
注意,如果作为参数的 Promise 实例,自己定义了catch方法,那么它一旦被rejected,并不会触发Promise.all()的catch方法。
小总结:
Promise对象一般用来处理异步(请求)事件的,根据异步请求回来的结果去操作相对应的成功或者失败的回调函数,Promise对象有一个参数是函数,这个函数又有俩个参数分别是resolve和reject,(这是俩个函数)分别代表成功和失败,如果成功了你可以调用resolve()而后通过你这个Promise对象的.then去进行操作,如果失败了可以调用reject()而后通过Promise对象的.then的第二个参数或者.catch进行失败的处理。.catch的用处就是在你的Promise对象中触发了reject后才会走.catch。Promise还有一个.finally不管是resolve还是reject都会执行。