Promise的关键点笔记

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的小技巧及注意事项

  1. Promise的.then是成功后触发的回调函数,回调函数中的参数是请求回来的内容。
  2. 有任何一个Promise是reject的,就会执行catch回调函数,回调函数中是错误信息。
  3. Promise的.then可以链式调用。
  4. 不管是then还是catch都会执行finally。
  5. Promise.all(参数是一个数组,数组里面放Promise)。 注意:必须是全部都是成功返回才会执行,有其中任意一个出错都不会执行.then(rejected)。

小总结:

Promise对象一般用来处理异步(请求)事件的,根据异步请求回来的结果去操作相对应的成功或者失败的回调函数,Promise对象有一个参数是函数,这个函数又有俩个参数分别是resolve和reject,(这是俩个函数)分别代表成功和失败,如果成功了你可以调用resolve()而后通过你这个Promise对象的.then去进行操作,如果失败了可以调用reject()而后通过Promise对象的.then的第二个参数或者.catch进行失败的处理。.catch的用处就是在你的Promise对象中触发了reject后才会走.catch。Promise还有一个.finally不管是resolve还是reject都会执行。

上一篇:promise


下一篇:利用js判断文件是否为utf-8编码