JavaScript异步编程的Promise

news2024/11/15 4:59:12

目录

1.对Promise的了解

(1)介绍

(2)Promise 的优缺点

2.Promise的基本用法

(1)创建Promise对象

(2)Promise方法then()

(3)Promise方法catch()

(4)Promise方法all()

(4)Promise方法race()

(5)Promise方法finally()

3.Promise的使用场景

(1)异步请求

(2)定时器

(3)动画效果

(4)多个异步操作的并行执行

(5)复杂的异步操作流程控制

4.Promise.all和Promise.race的区别

(1)Promise.all

(2)Promise.race

5.总结


本文主要讲解JavaScript异步编程中Promise的理解、基本用法和使用场景等等。

1.对Promise的了解

(1)介绍

Promise是JavaScript中用于处理异步操作的一种机制。它是一个代表了异步操作最终完成或失败的对象。Promise提供了更好的错误处理机制,并支持链式调用,避免了传统异步编程中的回调地狱问题。

Promise对象有三种状态:pending(进行中)、fulfilled(已成功resolved)和rejected(已失败),状态一旦改变就不会再变。

(2)Promise 的优缺点

优点:

链式调用.then() 方法返回一个新的 Promise,允许你进行链式调用,避免回调地狱。

错误处理.catch() 方法允许你集中处理 Promise 链中发生的错误。

组合能力:Promise 提供了多种组合多个 Promise 的方法,如 Promise.all()Promise.race() 等,使得处理多个异步操作变得更加容易。

缺点:无法取消Promise,一旦新建就会立即执行,无法中途取消;如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。

2.Promise的基本用法

Promise的基本用法包括其构造函数、then()、catch()、all()、race()、finally()方法。

(1)创建Promise对象

使用new Prommise创建Promise对象

const promise = new Promise((resolve,reject)=>{
    if(resolve){
        resolve("123");
    }else{
        reject(error);
    }
});
console.log(promise);

使用Promise.resolve()创建一个fulfilled状态的Promise对象

Promise.resolve("haha").then(value=>{
    console.log(value); // haha
});

使用Promise.reject()创建一个rejected状态的Promise对象

Promise.reject(new Error("我错了,请原谅!!"));

(2)Promise方法then()

then()方法用于指定Promise成功或失败时的回调函数,接受两个参数:第一个参数是Promise成功时的回调函数,第二个参数是Promise失败时的回调函数(通常省略,使用catch方法处理错误)。

const promise = new Promise((resolve,reject)=>{
    if(resolve){
        resolve();
    }else{
        reject(error);
    }
});
promise.then(()=>{
    console.log('resolved');
},()=>{
    console.log('rejected');
});

(3)Promise方法catch()

catch方法用于捕获Promise执行过程中的错误,并处理它们。它是.then(null, rejection)的语法糖,相当于then方法的第二个参数。

promise.catch(error=>{
    console.log(error);
});

(4)Promise方法all()

all()方法可以完成并行任务,它接受数组,每项数组都是一个Promise对象。数组中Promise的状态都是resolved时,all方法的状态就会变成resolved;如果有一个状态变为rejected,all方法的状态就会编程rejected。成功状态的结果是一个结果数组,失败状态结果是最先被reject状态的值。

Promise.all([
    new Promise((resolve, reject)=>{
        setTimeout(()=>{
            resolve("任务1完成");
        },2000)
    }),
    new Promise((resolve, reject)=>{
        setTimeout(()=>{
            resolve("任务2完成");
        },1000)
    }),
    new Promise((resolve, reject)=>{
        setTimeout(()=>{
            reject("任务3出错");
        },3000)
    })
]).then(res=>{
    console.log(res);
});

(4)Promise方法race()

 race()方法和all()方法一样,不同的是不论状态resolved或rejected,最先执行的事件执行完之后,直接返回该promise对象的值。

Promise.race([
    new Promise((resolve, reject)=>{
        setTimeout(()=>{
            resolve("任务1完成");
        },2000)
    }),
    new Promise((resolve, reject)=>{
        setTimeout(()=>{
            resolve("任务2完成");
        },1000)
    }),
    new Promise((resolve, reject)=>{
        setTimeout(()=>{
            reject("任务3出错");
        },3000)
    })
]).then(res=>{
    console.log(res); // 任务2完成
});

(5)Promise方法finally()

finally方法会在Promise执行结束后(无论是fulfilled或者rejected)执行,不接受任何参数,通常用于清理工作,如关闭文件描述符、释放资源等。

.finally(()=>{
    console.log('Promise结束');
});

3.Promise的使用场景

Promise在前端开发中有广泛的应用场景,主要包括以下几个方面:

(1)异步请求

在前端开发中,经常需要进行异步请求,如发送HTTP请求获取数据。使用Promise可以更好地处理这些异步请求,通过Promise的链式调用可以更清晰地表达异步操作之间的依赖关系。

function promiseFunction() {
    return new Promise((resolve, reject) => {
        setTimeout(function() {
            const success = true; // 模拟操作成功或失败  
            if (success) {  
                resolve('成功获取数据');  
            } else {  
                reject('获取数据失败');  
            }  
        }, 2000);
    });
}
promiseFunction().
    then(result => {
        console.log("成功", result); // 成功 成功获取数据
    })
    .catch(result => {
        console.log("错误", result)
    });

(2)定时器

Promise可以与定时器结合使用,通过Promise的resolve和reject方法来控制定时操作的执行结果。

(3)动画效果

Promise可以用于管理动画效果的执行顺序和完成状态。通过Promise的链式调用,可以按照预定的顺序执行动画效果,并在动画完成后执行回调函数。

(4)多个异步操作的并行执行

Promise提供了Promise.all方法,可以将多个Promise对象包装成一个新的Promise对象,当所有的Promise对象都完成时,新的Promise对象才会被解析。这样可以方便地实现多个异步操作的并行执行。

(5)复杂的异步操作流程控制

Promise提供了丰富的方法,如then、catch、finally等,可以灵活地组合和控制异步操作的执行流程。

4.Promise.all和Promise.race的区别

(1)Promise.all

接收一个包含多个Promise的数组(或类数组对象)作为参数,并返回一个新的Promise。

只有当数组中的所有Promise对象都成功完成时(即状态都变为fulfilled),返回的Promise对象才会成功完成,并将所有Promise的结果作为一个数组返回。如果数组中的任何一个Promise对象失败(即状态变为rejected),则返回的Promise对象会立即失败,并将第一个失败的Promise的原因作为失败原因返回。

适用于需要等待所有异步操作都成功完成后再进行下一步操作的场景。

(2)Promise.race

同样接收一个包含多个Promise的数组(或类数组对象)作为参数,并返回一个新的Promise。

这个返回的Promise会在数组中的任意一个Promise状态变为fulfilled或rejected时被解决或拒绝,且以第一个被解决的Promise的结果作为其结果返回。如果数组中的所有Promise都被拒绝,则返回的Promise将会以最先被拒绝的Promise的原因作为其原因拒绝。

适用于设置超时机制或只关心第一个完成的异步操作的场景。如下例子:

// race()
function timeoutPromise(time) {  
    return new Promise((resolve, reject) => {  
        setTimeout(() => {  
            reject(new Error('操作超时'));  
        }, time);  
    });  
}  
// 使用Promise.race()来监听哪个Promise先完成  
Promise.race([  
    longRunOperation(), // 长时间运行的操作  
    timeoutPromise(2000)    // 2秒后超时的Promise  
])  
.then(result => {  
    console.log(result); // 如果longRunningOperation在2秒内完成,则打印'操作完成'  
})  
.catch(error => {  
    console.error(error.message); // 如果timeoutPromise先完成(即超时),则打印'操作超时'  
})  

5.总结

Promise是JavaScript中处理异步操作的一种强大机制,它通过提供清晰的状态管理和链式调用,极大地简化了异步编程的复杂度。Promise的基本用法包括构造函数、then方法、catch方法和finally方法等,它们共同构成了Promise的核心功能。Promise在前端开发中有广泛的应用场景,包括异步请求、定时器、动画效果、多个异步操作的并行执行和复杂的异步操作流程控制等。了解Promise的基本用法和使用场景,以及Promise.all和Promise.race的区别,对于编写高效、可靠的异步代码至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1975958.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣SQL50 删除重复的电子邮箱 自连接删除 连表删除

Problem: 196. 删除重复的电子邮箱 👨‍🏫 参考题解 Code DELETE p1 FROM Person p1,Person p2 WHEREp1.Email p2.Email AND p1.Id > p2.Id

前端Web-JavaScript(下)

主要是补全一下JavaScript 基本对象: String对象 语法格式 方式1: var 变量名 new String("…") ; //方式一 例如: var str new String("Hello String"); 方式2: var 变量名 … ; //方式二 例如: var …

CHCSA第二次作业

#01、创建以上目录和文件结构,并将/yasuo目录拷贝4份到/目录下 [rootlocalhost ~]# ls /yasuo // 先检查是否有yasuo目录 ls: 无法访问 /yasuo: 没有那个文件或目录 [rootlocalhost ~]# mkdir -p /yasuo/dir1 // 递归创建目录 [rootlocalhost ~]#…

Pandas的30个高频函数使用介绍

Pandas是Python中用于数据分析的一个强大的库,它提供了许多功能丰富的函数。本文介绍其中高频使用的30个函数。 read_csv(): 从CSV文件中读取数据并创建DataFrame对象。 import pandas as pd df pd.read_csv(data.csv) read_excel(): 从Excel文件中读取数据…

嗖嗖移动业务大厅(JDBC)

一、项目介绍 1、项目背景: 该项目旨在模拟真实的移动业务大厅,。用户可以注册新卡、查询账单、管理套餐、充值话费、打印消费记录等功能。同时,项目还模拟了用户使用场景,如通话、上网、发短信等,并根据套餐规则进行相应的扣费…

AutoCAD ObjectArx二次开发(二) 关于程序入口的介绍

在上一章节中,我们介绍了环境搭建和程序插件的加载,基本的编程模板(框架)已经准备就绪。接下来,我们将开始编写自己的业务逻辑。ARX开发的核心在于将自定义函数注册到库中,并通过指定的调用命令来实现功能。…

【论文解读|Data Intelligence】 Large Knowledge Model: Perspectives and Challenges

论文链接:Large Knowledge Model: Perspectives and Challenges (sciengine.com) 来源: Data Intelligence 论文介绍: 文章简述了人类语言和世界知识的紧密关系,对比了语言模型和知识图谱在表示和处理人类知识方面的优缺点&…

Candance Allegro 入门教程笔记:PCB封装库的组成元素

文章目录 一、PCB封装库的组成元素二、使用Padstack Edictor制作封装焊盘引脚三、PCB Editor软件创建贴片封装(STM32F103T8U6 QFN36 为例)1.引入库2.读入数据 一、PCB封装库的组成元素 一般来说,针对于Allegro软件,完整的封装是由…

blender里的辉光

cycle的辉光, 点开支持后期效果 eevee的辉光,直接点bloom就行。 eevee的透明

GORM更新操作(Save、Update、Updates)

在 Go 语言的 Web 开发中,GORM 是一个广泛使用的 ORM (Object-Relational Mapping) 框架。它提供了一种流畅的方式来处理数据库的交互,其中包括记录的更新操作。GORM中的更新操作主要是update、updates、save这几种 操作前的准备工作:声明模…

C语言进阶版第五课—函数递归

文章目录 1. 什么是函数递归2. 函数递归的思想3. 函数递归的限制4. 函数递归练习4.1 n的阶乘4.2 按照顺序打印一个整数的每一位4.3 自定义函数不允许创建变量,求字符串长度 1. 什么是函数递归 函数递归就是函数自己调用自己 图片中的函数test(&#xff0…

Monaco 使用 TypeDefinitionProvider

Monaco 中的 TypeDefinitionProvider 和 ImplementationProvider、DefinitionProvider 类似,右键点击变量名称,现在 “选择转到类型定义”, 跳到指定位置。 通过 registerTypeDefinitionProvider 添加 TypeDefinitionProvider 处理方法 实现…

力扣SQL50 按日期分组销售产品 group_concact

Problem: 1484. 按日期分组销售产品 👨‍🏫 参考题解 select sell_date, count(distinct product) num_sold,group_concat(distinct product order by productseparator ,) products from activities group by sell_date

度量与增长——OrionX AI算力管理工具的企业价值解读

从科学计算到人工智能,从AI模型开发到AI模型训练,从双精度到半精度,从OPENGL到CUDA,GPU都扮演着关键角色。本文主要从运维的人员的角度出发,来探讨GPU使用过程中遇到的管理问题和创新性解决办法。 GPU的管理和监控 相…

《电容-排容》

节省电路板空间:将多个电容集成在一个封装里,减小了占用的电路板面积。 便于安装和布线:提高生产效率和电路布局的便利性。 一致性较好:由于是同一批次生产,各电容的性能参数较为一致。 【参数】品牌,封…

网络云相册实现--nodejs后端+vue3前端

目录 主页面 功能简介 系统简介 api 数据库表结构 代码目录 运行命令 主要代码 server apis.js encry.js mysql.js upload.js client3 index.js 完整代码 主页面 功能简介 多用户系统,用户可以在系统中注册、登录及管理自己的账号、相册及照片。 每…

Maven实战(四)- 生命周期和插件

Maven实战(四)- 生命周期和插件 文章目录 Maven实战(四)- 生命周期和插件1.何为生命周期2.生命周期2.1.Clean生命周期2.1.Default生命周期2.3.Site生命周期 3.Maven插件3.1.插件目标3.2.插件绑定3.2.1.内置插件3.2.2.自定义插件 4…

算法学习day28

一、寻找右区间(二分法) 题意:题目很容易理解 但是转换为二分法有点晦涩 给你一个区间数组 intervals ,其中 intervals[i] [starti, endi] ,且每个 starti 都 不同 。区间 i 的 右侧区间 可以记作区间 j ,并满足 startj > e…

gptpdf深度解析:开源文档处理技术全攻略

目录 一、引言二、gptpdf 是什么?三、gptpdf 的功能特性1. 精准的 PDF 元素解析能力2. 对复杂文档结构的处理示例3. 高效的处理速度4. 低成本的优势 四、gptpdf 应用场景1. 学术研究与文献处理2. 企业文档管理3. 软件开发中的文档转换 五、gptpdf 代码示例1. 基本的…

【Vue3】组件通信之v-model

【Vue3】组件通信之v-model 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的…