介绍一下js中Promise、async、await的使用

在JavaScript中,Promiseasyncawait是用于处理异步操作的核心概念。它们帮助我们更好地组织异步代码,避免回调嵌套问题,并使代码更简洁和易读。

1. Promise

Promise 是一种异步编程的解决方案,用于表示一个操作的最终完成(或失败),以及它所产生的结果。

  • 状态

    • pending:Promise 初始状态,既没有被解决也没有被拒绝。
    • fulfilled:操作成功完成,Promise 已被解决。
    • rejected:操作失败,Promise 被拒绝。
  • 用法

    • then():当Promise成功时执行回调。
    • catch():当Promise被拒绝时执行回调。
    • finally():无论Promise成功或失败,都会执行的回调。
创建一个Promise:
let promise = new Promise((resolve, reject) => {let success = true;if (success) {resolve("Operation succeeded!");} else {reject("Operation failed.");}
});promise.then(result => console.log(result))  // 如果成功,输出 "Operation succeeded!".catch(error => console.log(error))   // 如果失败,输出 "Operation failed.".finally(() => console.log("Operation completed."));

下面是一个更实际的 Promise 示例,模拟了从数据库中获取用户数据的场景。假设我们有一个函数 getUserData,该函数通过异步操作从“数据库”中获取用户信息,并返回一个 Promise。在操作过程中,可能会成功获取数据,也可能会发生错误(如数据库连接失败)。

示例代码:
// 模拟数据库操作的函数,返回一个 Promise
function getUserData(userId) {return new Promise((resolve, reject) => {console.log(`Fetching data for user with ID: ${userId}...`);// 模拟异步操作,假设操作时间为2秒setTimeout(() => {const userDatabase = {1: { name: 'Alice', age: 25, city: 'New York' },2: { name: 'Bob', age: 30, city: 'San Francisco' },3: { name: 'Charlie', age: 35, city: 'London' }};const userData = userDatabase[userId];if (userData) {resolve(userData);  // 成功获取数据,调用 resolve} else {reject(`No user found with ID: ${userId}`);  // 未找到用户,调用 reject}}, 2000);});
}// 使用 Promise 获取用户数据
getUserData(2).then(userData => {console.log('User data:', userData);  // 成功时输出用户数据}).catch(error => {console.error('Error:', error);  // 失败时输出错误信息}).finally(() => {console.log('Database operation completed.');  // 无论成功与否,都会执行});
解释:
  1. getUserData 函数

    • 模拟了一个异步的数据库查询操作,通过 setTimeout 模拟延迟。
    • 在2秒后,检查一个假设的用户数据库 userDatabase,如果找到相应的用户数据,就调用 resolve 来返回数据;如果没有找到,则调用 reject 返回错误信息。
  2. Promise 的使用

    • 通过 then() 方法处理成功的结果,即当用户数据被成功获取时,输出用户数据。
    • 通过 catch() 方法处理失败的结果,即当未找到用户时,输出错误信息。
    • 通过 finally() 方法处理无论成功或失败都会执行的操作,比如清理资源或结束操作的提示。

2. async/await

async/await 是基于 Promise 的更高层抽象,目的是让异步代码看起来像同步代码,从而提高可读性和简洁性。

  • async
    • 关键字 async 用于声明一个异步函数,异步函数总是返回一个 Promise
    • 如果返回值不是 Promise,JavaScript 会将其包装为已解决的 Promise
async function example() {return "Hello, World!";
}example().then(result => console.log(result));  // 输出: Hello, World!
  • await
    • await 只能在 async 函数中使用,用来等待一个异步操作的结果。
    • await 一个 Promise 时,函数暂停执行,直到 Promise 完成,并返回结果。
    • 它消除了 .then() 链式调用的复杂性,使代码更清晰。
async function fetchData() {let response = await fetch('https://api.example.com/data');let data = await response.json();return data;
}fetchData().then(data => console.log(data));

在这个例子中,await 会等待 fetch 请求的 Promise 完成,然后继续执行后续代码。

3. Promise 和 async/await 的对比

  • Promise 的写法是链式的,使用 .then().catch().finally(),它适合多个异步操作的顺序处理,但当嵌套过深时,代码可能会变得难以维护。
function getData() {return fetch('https://api.example.com/data').then(response => response.json()).then(data => {console.log(data);}).catch(error => {console.error(error);});
}
  • async/await 通过让代码看起来像同步的方式解决了回调地狱问题。它更加直观且容易处理错误。
async function getData() {try {let response = await fetch('https://api.example.com/data');let data = await response.json();console.log(data);} catch (error) {console.error(error);}
}

4. 错误处理

Promise 中,使用 .catch() 来捕获错误:

fetch('https://api.example.com/data').then(response => response.json()).catch(error => console.error('Error:', error));

async/await 中,使用 try/catch 来捕获错误:

async function fetchData() {try {let response = await fetch('https://api.example.com/data');let data = await response.json();return data;} catch (error) {console.error('Error:', error);}
}

总结

async/await 是基于 Promise 的语法糖,使用它们可以让代码更加整洁且易于维护。

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

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

相关文章

【IDEA】使用IDEA连接MySQL数据库并自动生成MySQL的建表SQL语句

前言: 在软件开发过程中,数据库的设计与实现是至关重要的一环。IntelliJ IDEA作为一款强大的集成开发环境(IDE),提供了丰富的数据库工具,使得连接MySQL数据库并自动生成建表SQL语句变得简单快捷。本文将详细…

《python语言程序设计》2018版第8章18题几何circle2D类(上部)

一、利用第7章的内容来做前5个点 第一章之1--从各种角度来测量第一章之2--各种结果第二章之1--建立了针对比对点在圆内的几段第二章之2--利用建立的对比代码,得出的第2点位置 第一章之1–从各种角度来测量 class Circle2D:def __init__(self, x, y, radius):self._…

Stable Diffusion绘画 | ControlNet应用-qrcode 二维码控制器:艺术二维码来啦

qrcode 二维码控制器,是一款专用于生成艺术二维码的控制器, 需要单独下载,下载后,将文件放置在:SD安装目录\extensions\sd-webui-controlnet\models 实操 开启第一个 ControlNet,上传一个二维码图片&…

【24华为杯数模研赛赛题思路已出】国赛E题第二套思路丨附参考代码丨免费分享

2024年数模研赛E题解题思路 在高速公路建设中,通常会设置应急车道,以便应对救援和医疗需求。应急车道一般不允许占用,但在某些情况下,如监测到某路段即将拥堵且没有事故时,合理使用应急车道可以帮助降低车流密度&…

对不起,放弃了wiki.js转向了obsidian

wifi.js可以满足我的以下要求: 支持文档在线编辑支持浏览器编辑支持二进制文件上传和下载支持历史记录和回滚支持用户账号分权支持数据和nas同步支持markdown的预览模式 但是wiki.js不能满足如下: markdown编辑无法做到图片复制粘贴无法查看pdf无法独立于文档上传…

影刀RPA实战:网页爬虫之药品数据

1 实战目标 这次给大家带来的实战示例是采集中国医药信息平台上的药品数据,主要获取药品名称,介绍,药品类型,处方类型,医保类型,参考价格,药品成分,性状,适应病症&#…

SAP B1 Web Client MS Teams App集成连载四

过程/Procedure: 1.通过点击选项卡旁边的下拉箭头,可以重新配置、重命名和移除现有选项卡。 You can reconfigure, rename and remove an existing tab by clicking the drop down arrow alongside the tab. 要重新配置选项卡,请选择“设置”…

HTML-DOM模型

1.DOM模型 window对象下的document对象就是DOM模型。 DOM描绘了一个层次化的节点树,每一个节点就是一个html标签,而且每一个节点也是一个DOM对象。 2.操作DOM 2.1.获取DOM对象常用方法 获取DOM对象的常用方法有如下几种: getElementById(…

无线麦克风哪个好,麦克风哪个品牌音质最好,领夹麦克风推荐

​无线领夹麦克风作为直播、视频录制等场景必备的设备之一,用起来很方便,功能多样且易于操作,在音频设备领域占据着重要地位。但当前市场乱象较为严重,有许多商家纷纷打起价格战,忽视了产品质量,造成耐用性…

李沐 多层感知机【动手学深度学习v2】

学习XOR 同或操作:相同为1,不同为0。 先进入蓝色和黄色分类器,最后进入灰色分类器来得到最终的结果。 单隐藏层 输入为x1~x4,加入隐藏层后,x1~x4需要先进入h1~h5,该隐藏层再作为输入,连接下一层…

【24华为杯数模研赛赛题思路已出】国赛E题思路丨附参考代码丨免费分享

2024年华为杯研赛E题解题思路 E题 高速公路应急车道紧急启用模型 问题1 1. 某路段(长度约5000m,行车道2应急车道1)上有四个视频观测点(见示意图1)。请基于该路段四个视频数据解决如下问题: (…

任天堂发言人:不会透露起诉《幻兽帕鲁》开发商细节

任天堂在昨天突然宣布将起诉《幻兽帕鲁》开发商 Pocketpair,除了引起许多玩家不满外,更多的是所有人的疑惑:因为实际上大家内心里觉得任天堂出手是理所当然的,但是为什么是在游戏发布数月后才选择起诉?此次诉讼是“专利…

解决引入ethereumjs-wallet报错Uncaught ReferenceError: process is defined

最近在学习web3.0开发DApp的视频教程,遇到用助记词生成秘钥对报错Uncaught ReferenceError: process is defined。具体报错如下截图: 在网上搜了好几个小时都没找到解决方法。突然在学习的视频论坛找到有哥们说是引入的包不兼容问题导致报这个错。我试了…

集合框架(一):Collection集合的遍历方式

一.迭代器遍历Collection集合 package com.njau.d2_collection_traverse;import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;/*** 目标:Collection集合的遍历方式一:使用迭代器Iterator对象遍历Collection集合*/ pub…

嵌入式常用硬件电路设计及分析 — 通信篇

目录 一、简介 二、RS232通信 1、硬件电路设计 2、硬件电路设计分析 (1)常规电路 (2)EMC设计使用注意事项 3、DB9接头定义 三、RS485通信 1、硬件电路设计 2、硬件电路设计分析 (1)自动收发电路…

【C++】C++入门概念(一)

C关键字 C总计63个关键字,C语言32个关键字 ps:下面我们只是看一下C有多少关键字,不对关键字进行具体的讲解。后面我们学到以后再详细讨论。 命名空间 在C/C中,变量、函数和后面要学到的类都是大量存在的,这些变量、…

神州数码社招校招入职北森测评笔试:语言理解、图形推理、材料计算

神州数码入职测评使用的是北森CATA-能力倾向计算机自适应测评 国内唯一被国际计算机自适应测验协会(IACAT)收录产品,基于企业大量招聘下对认知能力考察的需求,通过最新的测评技术手段,快速高效,评价候选人的认知能力,平均作答时…

Linux环境Docker安装Mongodb

Linux环境Docker安装Mongodb 环境要求拉取指定版本镜像创建映射目录(相当于数据存放于容器外,容器被删除不会影响数据)启动容器 进入mongo命令行为指定db创建新用户查看mongodb的容器id进入命令行查看所有db切换db为指定db创建新用户使用新账…

CZ 即将回归,这四个月币安疯狂上币用意何在?

随着币安创始人赵长鹏(CZ)即将在2024年9月29日刑满释放,市场上对于他的回归以及币安未来战略方向的讨论愈演愈烈。自今年4月,CZ因违反美国反洗钱法被判四个月监禁后,币安并没有停下发展的步伐,反而在CZ缺席…

【python设计模式7】行为型模式2

目录 策略模式 模板方法模式 策略模式 定义一个个算法,把它们封装起来,并且使它们可以相互替换。本模式使得算法可独立于使用它的客户而变化。角色有:抽象策略、具体策略和上下文。 from abc import abstractmethod, ABCMeta from datetim…