Promise与async await的作用及应用场景

news2025/1/19 19:21:18

在Web前端开发中,处理异步操作是非常常见的需求。为了解决这个问题,ES6引入了Promise和后续的async await。本文将介绍Promise和async await的作用,以及在实际开发中的应用场景。

一、Promise的作用及应用场景

Promise是一个表示异步操作最终完成或失败的对象。它可以将回调地狱转化为链式调用,使代码更加整洁和可读。Promise具有以下几个核心方法:

1.1 resolve()
resolve方法用于将Promise对象从未完成状态转为成功状态(即从pending变为fulfilled)。它接受一个参数,该参数就是成功后的结果值。例如:

const promise = new Promise((resolve, reject) => {
   resolve('成功');
});

promise.then((result) => {
    console.log(result); // 输出:成功
});

1.2 reject()
reject方法用于将Promise对象从未完成状态转为失败状态(即从pending变为rejected)。它接受一个参数,该参数就是失败后的错误信息。例如:

const promise = new Promise((resolve, reject) => {
   reject('失败');
});

promise.catch((error) => {
    console.error(error); // 输出:失败
});

1.3 then()
then方法用于添加成功后的回调函数。它接受两个参数,第一个参数是成功后的处理函数,第二个参数是失败后的处理函数。例如:

const promise = new Promise((resolve, reject) => {
   resolve('成功');
});

promise.then((result) => {
    console.log(result); // 输出:成功
}, (error) => {
    console.error(error);
});

1.4 catch()
catch方法用于添加失败后的回调函数。它与then方法的第二个参数作用相同。例如:

const promise = new Promise((resolve, reject) => {
   reject('失败');
});

promise.catch((error) => {
    console.error(error); // 输出:失败
});

Promise的应用场景非常广泛,下面以一个简单的异步获取数据的例子来说明:

const fetchData = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            const data = '这是异步获取的数据';
            resolve(data);
        }, 1000);
    });
};

fetchData().then((data) => {
    console.log(data); // 输出:这是异步获取的数据
});

二、async await的作用及应用场景

async await是ES2017引入的新特性,可以更简洁地处理异步操作。async函数返回一个Promise对象,可以通过await关键字来暂停函数的执行,等待Promise对象的状态变为resolved后继续执行。

2.1 async
async关键字用于定义一个异步函数。异步函数可以包含await关键字,以便在需要等待异步操作结果时暂停函数的执行。例如:

async function fetchData() {
    return '这是异步获取的数据';
}

fetchData().then((data) => {
    console.log(data); // 输出:这是异步获取的数据
});

2.2 await
await关键字用于暂停异步函数的执行,等待Promise对象的状态变为resolved后继续执行。注意,await只能在异步函数(即用async关键字定义的函数)中使用。例如:

const fetchData = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            const data = '这是异步获取的数据';
            resolve(data);
        }, 1000);
    });
};

async function getData() {
    const data = await fetchData();
    console.log(data); // 输出:这是异步获取的数据
}

getData();

async await的应用场景通常是在需要按顺序执行多个异步操作的情况下,提高代码的可读性和可维护性。

三、Promise与async await的对比

Promise和async await都是处理异步操作的方式,它们各有优劣。下面是它们的对比:

3.1 可读性
Promise的链式调用相对于回调地狱来说已经很大的提高了可读性,但是对于多个异步操作的情况下,仍然需要嵌套多个then方法,可能会导致代码结构不够清晰。而async await则通过使用async关键字定义异步函数和await关键字暂停函数的执行,使代码更加简洁明了。

3.2 错误处理
Promise使用catch方法来统一处理异步操作中的错误,而async await则可以使用try catch语句来捕获错误并进行处理。这使得错误处理更加灵活,也更容易定位错误。

3.3 兼容性
Promise是ES6中引入的新特性,在较老的浏览器中可能不被完全支持。而async await是ES2017中引入的特性,对于一些较老的浏览器需要使用babel等工具进行转译,以保证兼容性。

综上所述,Promise和async await都是处理异步操作的有效方式。选择合适的方式取决于具体的应用场景和个人习惯。在实际开发中,可以根据项目需求灵活选择使用Promise还是async await来提高开发效率和代码可读性。

更多面试题请点击 web前端高频面试题_在线视频教程-CSDN程序员研修院

最后问候亲爱的朋友们,并邀请你们阅读我的全新著作。

在这里插入图片描述

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

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

相关文章

【MySQL】学习约束和使用图形化界面创建表

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-iqtbME2KmWpQFQSt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

综合例题及补充

目录 查询员工的编号、姓名、雇佣日期,以及计算出每一位员工到今天为止被雇佣的年数、月数、天数 计算出年 计算月 计算天数 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 查询员工的编号、姓名、雇佣日期&#xff0c…

S32 Design Studio的PE工具

S32 Design Studio软件是NXP公司专门为了方便用户开发S32K1系列芯片的IDE,跟Eclipse比较像。里面有个配套的图形工具Processor Expert,会产生一个后缀名为pe的文件,跟ST的cubemx作用类似。 双击pe文件即可打开pe界面,生成的文件将…

Codeforces Round 925 (Div. 3)

Codeforces Round 925 (Div. 3) Codeforces Round 925 (Div. 3) A. Recovering a Small String 题意:给出一个整数n,为三个26个字母的位置序号的和,输出字典序最小的三个字符的字符串。 思路:直接倒推,顺一遍&…

第6个-滚动动画

Day 6 - Scroll Animation 1. 演示效果 2. 分析思路 布局 所有的内容进行水平垂直居中,可以使用**margin:0 auto;,也可以使用flex**布局: body {background-color: #efedd6;display: flex;flex-direction: column;justify-content: center…

腾讯云幻兽帕鲁服务器配置怎么选择合适?

腾讯云幻兽帕鲁服务器配置怎么选?根据玩家数量选择CPU内存配置,4到8人选择4核16G、10到20人玩家选择8核32G、2到4人选择4核8G、32人选择16核64G配置,腾讯云百科txybk.com来详细说下腾讯云幻兽帕鲁专用服务器CPU内存带宽配置选择方法&#xff…

音视频剪辑|FFMPEG|windows10下的音视频格式转换,遮挡填充,GIF动图制作,背景音频抽取,替换

前言: 最近对于音视频和图像的处理问题比较感兴趣,但发现很多目前需要的功能要么需要付费但不会过于麻烦,要么比较麻烦,很可能某个功能实现需要安装很多软件 例如,视频转GIF动图,该功能的实现要么使用Pho…

VMware清理拖拽缓存 Ubuntu硬盘情况占用分析

这两天在尝试编译Linux源码,我在win上将源码下载下来然后复制到ubuntu上,这一步我粗略看到了三种方法:安装VM tools,就可以使文件正常的在win和ubuntu中复制剪切;使用scp命令将win和linux系统链接起来;使用…

P5440 【XR-2】奇迹 (大模拟dfs+欧拉筛板子+闰年)

传送门https://www.luogu.com.cn/problem/P5440 相信奇迹的人,本身就和奇迹一样了不起。——笛亚 《星游记》 思路历程:很离谱的一题,在理论上并不困难,只要简单dfs欧拉筛就能过。在一开始,我采用了倒着模拟的思路&am…

JavaWeb:关于登录认证的简单拓展

前提介绍 本文基于文章-------JavaWeb:SpringBootWeb登录认证 --黑马笔记 -------再做简单拓展 如果没有关于登录认证知识的基础,可以先看上面所说的的文章,文章在专栏javaweb中,下面我为了大家观看,直接放了链接。…

服务降级(Sentinel)

服务降级 采用 SentinelResource 注解方式实现, 必要的 依赖必须引入 以及 切面Bean 接口代码 RequestMapping("/degrade")SentinelResource(value DEGRADE_RESOURCE_NAME, blockHandler "blockHandlerForDegrade",entryType EntryType.IN…

Excel模板2:进度条甘特图

Excel模板2:进度条甘特图 ‍ 今天复刻B站up【名字叫麦兜的狗狗】的甘特图:还在买Excel模板吗?自己做漂亮简洁的甘特图吧!_哔哩哔哩_bilibili 阿里网盘永久分享:https://www.alipan.com/s/cXhq1PNJfdm 当前效果&…

2.13 数组练习

1、选择题 1.1、若有定义语句:int a[3][6]; ,按在内存中的存放顺序,a 数组的第10个元素是 B A)a[0][4] B) a[1][3] C)a[0][3] D)a[1][4] 解析:二维数组在内存中是以行优先的方式存放的。这意味着首先填充第一行的…

Excel练习:折线图突出最大最小值

Excel练习:折线图突出最大最小值 ​​ 要点:NA值在折现图中不会被绘制,看似一条线,实际是三条线。换成0值和""都不行。 ‍ 查看所有已分享Excel文件-阿里云 ‍ 学习的这个视频:Excel折线图&#xff0c…

java之jvm详解

JVM内存结构 程序计数器 Program Counter Register程序计数器(寄存器) 程序计数器在物理层上是通过寄存器实现的 作用:记住下一条jvm指令的执行地址特点 是线程私有的(每个线程都有属于自己的程序计数器)不会存在内存溢出 虚拟机栈(默认大小为1024kb) 每个线…

MySQL:常用指令

MySQL官网 一、在Windows 系统 cmd窗口里执行的命令 启动:net start MySQL停止:net stop MySQL卸载:sc delete MySQL 二、在macOS系统终端里执行的命令 启动:mysql.server start停止:mysql.server stop重启:mysql.server restart 三、执行帮…

微信小程序(四十四)鉴权组件插槽-登入检测

注释很详细,直接上代码 新增内容: 1.鉴权组件插槽的用法 2.登入检测示范 源码: app.json {"usingComponents": {"auth":"/components/auth/auth"} }app.js App({globalData:{//定义全局变量isLoad:false} })…

Excel模板1:彩色甘特图

Excel模板1:彩色甘特图 分享地址 当前效果:只需要填写进度, 其余效果都是自动完成的 。 阿里网盘永久分享:https://www.alipan.com/s/cXhq1PNJfdm ​省心。能用公式的绝不使用手动输入。 ​​ 这个区域以及标题可以手动输入…

react【四】css

文章目录 1、css1.1 react和vue css的对比1.2 内联样式1.3 普通的css1.4 css modules1.5 在react中使用less1.6 CSS in JS1.6.1 模板字符串的基本使用1.6.2 styled-components的基本使用1.6.3 接受传参1.6.4 使用变量1.6.5 继承样式 避免代码冗余1.6.6 设置主题色 1.7 React中添…

golang集成sentry: go-redis

网上没有找到go-redis集成sentry的库, 所以我简单实现了一个 代码: https://github.com/Shujie-Tan/go-redis-sentry 使用方法: import (redis_sentry "github.com/Shujie-Tan/go-redis-sentry" ) rdb : redis.NewClient(&re…