大家好,我是蓝胖子的小叮当,今天分享的是JavaScript的第七章Promise,大家在阅读期间有任何的意见或建议都可以留言给我哈!
7.1前言
Promise是一个对象,它代表一个最终会完成或失败的异步操作。Promise是为了解决回调地狱的痛点,是异步编程的解决方案。
7.2状态
Promise本质是一个状态机,可以将它划分为三个阶段:
- pending(进行中)状态还在等待中,没有被兑现,也没有被拒绝
- fulfilled(已完成)代表已兑现状态
- rejected(已失败)代表已拒绝状态
状态的变更是单向的,只能从pending->fulfilled或pending->rejected,状态变更不可逆。
7.3构造函数
Promise是通过构造函数创建的,其参数是一个函数,该函数接受两个参数:resolve和reject。
-
resolve函数用于将Promise的状态由pending变更为fulfilled,并传递成功的值,同时会回调Promise对象的then方法
-
reject函数用于将Promise的状态由pending变更为rejected,并传递失败的值,同时会回调Promise对象的catch方法
7.4实例方法
Promise对象具有then()、catch()、finally()三种方法。
- then()方法用于指定Promise的状态变更为fulfilled的调用方法,允许链式调用。
- catch()方法用于指定Promise的状态变更为rejected的调用方法,不允许链式调用。
- finally()方法用于无论Promise是成功还是失败,都会执行的方法,允许链式调用。
7.5链式调用
-
then()和finally()会按顺序依次执行,每一个then()都会被执行,直到异常跳到catch();
-
then()默认会向下顺序执行,return是不能中断的,可以通过throw,如:throw new Error("error!!!") 来跳转至catch()实现中断;
-
catch()块只会执行第一个,并且再书写链式调用时,将catch()放在最后,因为catch()执行后,catch()后续的then()和finally()也会被照常调用;
-
then()或catch()返回的值不能时Promise本身,否则会造成死循环。
7.6原型方法
- Promise.all() 多个Promise任务同时执行,如果全部成功则返回数组的形式的执行结果,如果有失败则返回那失败的任务结果(等待所有兑现(或第一个拒绝)的结果)(有一个失败则结果为失败)
- Promise.allSettled() 无论成功与否都等异步结束再继续执行,返回数组的形式的执行结果
- Promise.any() 多个Promise任务同时执行,如果全部失败则返回数组的形式的执行结果,如果有成功则返回那成功的任务结果(等待所有失败(或第一个成功)的结果)(有一个成功则结果为成功)
- Promise.race() 多个Promise任务同时执行时,返回最先执行完的Promise任务的结果
7.7示例
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("任务完成1"), 1000);
});
promise.then(result => {
console.log(result);
return "任务完成2";
}).then(result => {
console.log(result);
throw new Error('中断链式调用');
}).finally(() => {
console.log("操作完成");
}).then(() => {
console.log("链式调用结束");
}).catch(error => {
console.error(error);
})
// 任务完成1
// 任务完成2
// 操作完成
// Error:中断链式调用
fetchData() {
const request1 = axios.get('/api/data1'); // 第一个请求
const request2 = axios.get('/api/data2'); // 第二个请求
Promise.all([request1, request2]) // 将所有请求包装成Promise对象
.then(responses => {
// 根据返回的数据进行相应操作
this.processResponse(responses[0].data);
this.processResponse(responses[1].data);
})
.catch(error => {
console.error('请求失败', error); // 错误处理
});
},
processResponse(response) {
// 处理每个请求的返回数据
console.log('处理返回数据', response);
}
好啦,关于Promise的知识点就总结到这里,如果有什么疑问、意见或建议,都可畅所欲言,谢谢大家,我也将持续更新。
预告:Promise不易读,代码复杂?欢迎收看JavaScript基础的下一章:Async/Await