Promise简介:
Promise对象用于表示一个异步操作的最终状态(完成或失败),以及该异步操作的结果值。
Promise的次要作用:
Promise是为了解决代码的嵌套问题。
有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。
Promise的特点:
Promise里的内容会立即执行。
Promise的三个状态:
- pedding(进行中)
- rejected(已失败)
- fulfilled(已成功)
只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是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的.then是成功后触发的回调函数,回调函数中的参数是请求回来的内容。
- 有任何一个Promise是reject的,就会执行catch回调函数,回调函数中是错误信息。
- Promise的.then可以链式调用。
- 不管是then还是catch都会执行finally。
- Promise.all(参数是一个数组,数组里面放Promise)。 注意:必须是全部都是成功返回才会执行,有其中任意一个出错都不会执行.then(rejected)。
小总结:
Promise对象一般用来处理异步(请求)事件的,根据异步请求回来的结果去操作相对应的成功或者失败的回调函数,Promise对象有一个参数是函数,这个函数又有俩个参数分别是resolve和reject,(这是俩个函数)分别代表成功和失败,如果成功了你可以调用resolve()而后通过你这个Promise对象的.then去进行操作,如果失败了可以调用reject()而后通过Promise对象的.then的第二个参数或者.catch进行失败的处理。.catch的用处就是在你的Promise对象中触发了reject后才会走.catch。Promise还有一个.finally不管是resolve还是reject都会执行。