ES6的Promise详解
作者:小教学发布时间:2023-09-18分类:程序开发学习浏览:75
文章目录
- 前言
- 一、Promise的概念
- 二、使用承诺
- 创建承诺
- Promise常用方法
- Promise.Prototype.Then()
- Promise.Prototype.Catch()
- 全部()
- 链式调用
前言
本篇文章主要介绍了ES6语法中的Promise对象的使用详解、Promise对象是JS进阶学习中的重要知识点、
如果本文对你有所帮助请三连支持博主,你的支持是我更新的动力,先赞后看养成习惯.
以下是本篇文章正文内容
一、Promise的概念
Promise是异步编程的一种解决方案
,是一个对象
、可以获取异步操作的消息,大大改善了异步编程的困难,避免了回调地狱,比传统的解决方案回调函数和事件更合理和更强大.
所谓承诺,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象
、从它可以获取异步操作的消息.Promise提供统一的接口,各种异步操作都可以用同样的方法进行处理。
ES6开始支持承诺
答应对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。简而言之,就是处理异步请求的.之所以叫做承诺,就是承诺做这件事,如果成功则怎么处理,失败则怎么处理。
Promise 首先是一个对象
(是一个对象!)、它通常用于描述现在开始执行,一段时间后才能获得结果的行为(异步行为),内部保存了该异步行为的结果.然后,它还是一个有状态的对象
:
- 待定:待定
- 已履行:兑现,有时候也叫解决(已解析)
- 已拒绝:拒绝
一个Promise只有这 3 种状态
,且状态的转换过程有且仅有 2 种
:
- 已完成挂起的到(已解决)
- 已拒绝挂起的到
二、使用承诺
创建承诺
调用Promise构造函数来创建一个Promise。
let promise = new Promise((resolve, reject) => {// 要做的事情...});
Promise构造函数接收一个函数作为参数,该函数的两个参数是Resolve,Reject,它们由脚本引擎提供。
resolve 函数的作用是
,将Promise对象的状态从“未完成”变为“成功”
(即从Pending变为Resolded),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject 函数的作用是
,将Promise对象的状态从“未完成”变为“失败”
(即从Pending变为Reduced),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
Promise常用方法
Promise.Prototype.Then()
然后,方法可以接收两个回调函数作为参数,第一个回调函数是Promise对象的状态改变为Resoled是调用,第二个回调函数是Promise对象的状态变为拒绝了时调用。其中第二个参数可以省略.
promise.then((resoved)=>{
console.log('成功')
},(rejected)=>{
console.log('失败')
})
Promise.Prototype.Catch()
该方法相当于,然后方法的第二个参数,指向拒绝的回调函数。
另一个作用是在执行Resolve回调函数时,如果出错,抛出异常,不会停止运行,而是进入Catch方法中。
Catch只接受一个参数,也就是拒绝了抛出的值,一般用于异常处理。传统的Try/Catch捕获不了Promise内部的异常的,因为抛出异常这个动作是异步的。在处理异常的时候,我们可以在接住了中进行异常的捕获,也可以直接抛出异常。
p.then((data) => {
console.log('resolved',data);
},(err) => {
console.log('rejected',err);
}
);
p.then((data) => {
console.log('resolved',data);
}).catch((err) => {
console.log('rejected',err);
});
全部()
Promise的All方法提供了并行执行异步操作的能力,在All中所有异步操作结束后才执行回调.
function p1() {
var promise1 = new Promise(function (resolve, reject) {
console.log("p1的第一条输出语句");
resolve("p1完成");
});
return promise1;
}
function p2() {
var promise2 = new Promise(function (resolve, reject) {
console.log("p2的第一条输出语句");
setTimeout(() => {
console.log("p2的第二条输出语句");
resolve("p2完成");
}, 2000);
});
return promise2;
}
function p3() {
var promise3 = new Promise(function (resolve, reject) {
console.log("p3的第一条输出语句");
resolve("p3完成");
});
return promise3;
}
Promise.all([p1(), p2(), p3()]).then(function (data) {
console.log(data);
});
输出结果:
p1的第一条输出语句;
p2的第一条输出语句;
p3的第一条输出语句;
p2的第二条输出语句[("p1完成", "p2完成", "p3完成")];
链式调用
链式调用的过程中Then()方法或Catch()方法的回调的返回值会作为下一个Then()方法的回调的参数,无返回值也可继续.Then(),如果没有错误,Catch方法将发生穿透。
new Promise((resolve, reject) => {
resolve('请求成功了');
})
.then((value) => {
console.log(value);
return new Error('错误');
})
.catch(() => {
console.log('错误'); //未打印,发生穿透
})
.then((value) => {
console.log(111);
})
.then((value) => {
console.log(222);
})
- 程序开发学习排行
-
- 1鸿蒙HarmonyOS:Web组件网页白屏检测
- 2HTTPS协议是安全传输,为啥还要再加密?
- 3HarmonyOS鸿蒙应用开发——数据持久化Preferences
- 4记解决MaterialButton背景颜色与设置值不同
- 5鸿蒙HarmonyOS实战-ArkUI组件(RelativeContainer)
- 6鸿蒙HarmonyOS实战-ArkUI组件(Stack)
- 7鸿蒙HarmonyOS实战-ArkUI组件(GridRow/GridCol)
- 8[Android][NDK][Cmake]一文搞懂Android项目中的Cmake
- 9鸿蒙HarmonyOS实战-ArkUI组件(mediaquery)
- 最近发表
-
- WooCommerce最好的WordPress常用插件下载博客插件模块的相关产品
- 羊驼机器人最好的WordPress常用插件下载博客插件模块
- IP信息记录器最好的WordPress常用插件下载博客插件模块
- Linkly for WooCommerce最好的WordPress常用插件下载博客插件模块
- 元素聚合器Forms最好的WordPress常用插件下载博客插件模块
- Promaker Chat 最好的WordPress通用插件下载 博客插件模块
- 自动更新发布日期最好的WordPress常用插件下载博客插件模块
- WordPress官方最好的获取回复WordPress常用插件下载博客插件模块
- Img to rss最好的wordpress常用插件下载博客插件模块
- WPMozo为Elementor最好的WordPress常用插件下载博客插件模块添加精简版