JS中async/await功能介绍和使用演示

JS 中 async/await 功能介绍与使用演示

一、功能介绍
  1. 基本概念

    • async:用于声明异步函数,返回一个 Promise 对象。即使函数内没有显式返回 Promise,也会隐式将返回值封装为 Promise.resolve()
    • await:仅能在 async 函数内部使用,用于等待 Promise 对象的解析(resolve)或拒绝(reject)。它使异步代码看起来类似同步代码,提升可读性。
  2. 核心特性

    • 异步流程同步化:通过 await 暂停函数执行,直到 Promise 完成,再继续后续逻辑。
    • 错误传播:若 await 后的 Promise 被拒绝(reject),会抛出错误,需用 try/catch 捕获。
    • 兼容性async/await 是 ES2017 引入的语法糖,底层基于 Promise,兼容现代浏览器和 Node.js。
  3. 使用场景

    • 替代回调函数和 .then() 链式调用,处理异步操作(如 API 请求、文件读写)。
    • 串行或并行执行多个异步任务,优化代码结构。

二、使用演示
  1. 基础示例:顺序执行异步任务

    // 模拟异步请求函数
    function fetchData(url) {return new Promise((resolve) => {setTimeout(() => {resolve(`Data from ${url}`);}, 1000);});
    }// 使用 async/await 顺序执行
    async function fetchSequentially() {try {const data1 = await fetchData('api1');console.log(data1); // Data from api1const data2 = await fetchData('api2');console.log(data2); // Data from api2} catch (error) {console.error('Error:', error);}
    }fetchSequentially();
    
  2. 并发执行异步任务
    使用 Promise.all 并行处理多个请求,减少总耗时:

    async function fetchConcurrently() {try {const [data1, data2] = await Promise.all([fetchData('api1'),fetchData('api2')]);console.log(data1, data2); // 同时输出两个结果} catch (error) {console.error('Error:', error);}
    }fetchConcurrently();
    
  3. 错误处理
    结合 try/catch 捕获异步错误:

    async function fetchWithErrorHandling() {try {const response = await fetch('https://invalid.url');const data = await response.json(); // 如果响应失败,此处会抛错} catch (error) {console.error('Caught error:', error);}
    }fetchWithErrorHandling();
    
  4. 实用场景:模拟延迟执行
    实现休眠函数:

    function delay(ms) {return new Promise((resolve) => setTimeout(resolve, ms));
    }async function delayedTask() {console.log('Task started');await delay(2000); // 暂停2秒console.log('Task completed');
    }delayedTask();
    

三、注意事项
  1. await 的局限性

    • 只能在 async 函数内使用,否则会抛出语法错误。
    • 后面可以是任意表达式(如字符串、数值),非 Promise 会被自动封装为 Promise.resolve()
  2. 错误处理

    • 未捕获的 reject 会导致 async 函数返回的 Promise 变为 reject 状态,需用 try/catch.catch() 处理。
  3. 性能优化

    • 避免过度串行:连续使用 await 会导致异步任务串行执行,降低性能。可改用 Promise.all 并发处理无关依赖的任务。
    • 不要阻塞主线程:长时间同步操作(如循环)中滥用 await 可能阻塞渲染,需谨慎设计异步流程。

四、总结

async/await 是 JavaScript 异步编程的语法糖,本质是基于 Promise,但提供了更简洁、易读的代码风格。它适用于大多数异步场景,尤其适合需要顺序执行或并发控制的场景。使用时需注意错误处理和性能优化,避免陷入同步思维的误区。

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

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

相关文章

系统调用入口机制:多架构对比理解(以 ARM64 为主)

📖 推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》 🎥 更多学习视频请关注 B 站:嵌入式Jerry 系统调用入口机制:多架构对比理解(以 ARM64 为主) 本篇内容聚焦于系统调用的入口实现机…

java MultipartFile初始化

在Java中,MultipartFile 是Spring框架中用于处理文件上传的接口。​开发者通常不会直接初始化MultipartFile对象,而是通过Spring MVC的控制器方法参数接收上传的文件。如果需要在测试或模拟场景中创建其实例,可以使用Spring的MockMultipartFi…

Linux C IO多路复用

在上一节利用管道实现了一个简单的聊天室,但这个聊天室有一个很明显的问题就是,当A处于读阻塞情况下是不能向B发送消息的,只有收到B的消息才能发送。如何实现同时既能接受B的消息,又能向其发送消息?很遗憾,…

day21——特殊文件:XML、Properties、以及日志框架

文章目录一、特殊文件概述二、Properties属性文件2.1 文件特点2.2 Properties类解析2.3 写入属性文件三、XML文件详解3.1 XML核心特性3.2 XML解析(Dom4J)3.3 XML写入3.4 XML约束(了解)四、日志技术(Logback&#xff09…

经典VB与现代VB(VB.NET)

Visual Basic(VB)目前其发展状态可以分为经典VB(VB6及之前)​和现代VB(VB.NET)​两个阶段。经典VB诞生于1991年,凭借​“快速开发(Rapid Application Development, RAD)”…

iOS UI视图面试相关

iOS UI视图面试相关 UITableVIew相关 重用机制 cell [tableView dequeueReusableCellWillIdentifier:identifer];其中A2、A3、A4、A5是完全显示在屏幕,A2、A6显示部分,A1和A7不在显示范围内,假如现在是从下滑时的结果,在A1消失时…

网络编程-tcp连接:服务器与客户端

使用服务器和客户端的代码&#xff0c;实现服务器和客户端的互相聊天功能 实现两台电脑之间互相聊天 方案一&#xff1a;服务器代码&#xff08;server.c&#xff09;#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h>…

跨平台移动开发技术深度分析:uni-app、React Native与Flutter的迁移成本、性能、场景与前景

1. 引言 跨平台移动开发技术已成为提升开发效率、降低成本的战略性选择。uni-app、React Native&#xff08;RN&#xff09;和Flutter作为主流方案&#xff0c;在迁移成本、应用性能、适用场景及未来发展上呈现显著差异。本报告基于最新行业数据与技术演进&#xff08;2025年&…

详解低速容错CAN(附与高速CAN对比表)

文章目录前言一、低速容错CAN-低速二、低速容错CAN-容错2.1 信号电平2.2 终端电阻2.3 容错机制前言 在ISO 11898-3 Low-speed, fault-tolerant, medium-dependent interface部分描述了低速CAN的容错行为及其物理层内容。既然称为低速容错CAN&#xff0c;主要需要搞清楚的两个核…

维基框架发布 1.0.11 至中央仓,深化国产化 DevOps 生态整合

一、核心事件&#xff1a;维基框架 1.0.11 正式入驻中央仓库​ ​维基框架&#xff08;Wiki-Framework&#xff09;​​ 作为国产全场景 Java 企业级开发框架&#xff0c;于 7 月 9 日正式发布 ​v1.0.11 版本​ 至中央软件仓库&#xff08;Maven Central&#xff09;&#xf…

vscode 打开c++文件注释乱码

之前一直都主要用vscode编辑lua和python脚本语言&#xff0c;没怎么编辑过c文件&#xff0c;今天想打开一个文件看一个东西&#xff0c;但是注释全部乱码了&#xff0c;我也知道是文件编码的问题&#xff0c;但没找到修改编码格式的地方&#xff0c;好了废话不多说&#xff0c;…

波动回升正当时!期权合成多头:震荡市攻守兼备利器

上周&#xff0c;A股喜提关键突破&#xff01;上证指数自21年初以来首次稳稳站上3500点大关&#xff0c;市场整体震荡上行。尐程序&#xff1a;期权汇不过&#xff0c;热闹之下也藏有隐忧&#xff1a;虽然日均成交维持在1.4万亿加&#xff0c;但周五放量冲高&#xff08;成交达…

Python 基础(十四): 错误和异常

目录 1 错误2 异常 2.1 内置异常2.2 异常处理2.3 抛出异常2.4 自定义异常 程序中的错误我们通常称为 bug &#xff0c;工作中我们不仅需要改自己程序中的 bug &#xff0c;还需要改别人程序中的 bug &#xff0c;新项目有 bug 要改&#xff0c;老项目也有 bug 要改&#xff…

OpenCV-Python Tutorial : A Candy from Official Main Page(三)

3.11傅立叶变换3.11.1Fourier Transform in OpenCV-cv.dft、cv.magnitude、cv.idft这两个函数是图像频域处理&#xff08;如去噪、边缘增强、纹理分析&#xff09;的基础工具。1.cv.dft() —— 离散傅里叶变换功能&#xff1a; 将图像从空间域&#xff08;像素强度&#xff09;…

移动端字体适配

一、移动端图片适配1、使用 <img> 的 srcset<img src"logo.png"srcset"logo2x.png 2x,logo3x.png 3x"alt"Logo">优点&#xff1a;原生支持&#xff0c;浏览器自动选择最合适的图片。2、使用媒体查询切换背景图.logo {background-ima…

git起步

git官网&#xff1a;https://git-scm.com git使用手册&#xff1a;https://git-scm.com/book/zh/v2 一、Git 是什么&#xff1f; 1、版本控制 版本控制是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。我们经常是用的是保存软件源代码的…

SSL与HTTP概述

一、概念1.SSL概念SSL&#xff08;Secure Sockets Layer&#xff09;是一种网络安全协议&#xff0c;用于在互联网通信中建立加密链接&#xff0c;保护在网络中传输的敏感数据免遭窃取或篡改。2.TLS概念虽然现在更先进的 TLS&#xff08;Transport Layer Security&#xff09; …

前端报错:“Uncaught SyntaxError: missing ) after argument list

问题描述&#xff1a;前端报错&#xff1a;“Uncaught SyntaxError: missing ) after argument list在 JavaScript 中遇到“SyntaxError: missing ) after argument list”这个错误通常意味着在函数调用或者声明中&#xff0c;参数列表的括号没有正确闭合。错误代码&#xff1a…

广州邮科光纤交换机的应用:网络世界中的幕后核心

你知道吗&#xff1f;在我们每天畅游互联网&#xff0c;发送邮件、看视频、打游戏时&#xff0c;背后支撑这一切流畅体验的关键设备之一就是光纤交换机。它像一个幕后英雄&#xff0c;默默地确保信息传输高效、稳定。那么&#xff0c;究竟邮科光纤交换机有哪些不可或缺的应用领…

C++内存布局、构造函数规则和优化策略解析

一、类对象内存布局深度解析 1.1 核心内存占用规则 ​非静态成员变量​&#xff1a;每个对象独立存储&#xff0c;按声明顺序排列&#xff08;含内存对齐填充&#xff09; 示例&#xff1a;class A{int x; char y;}; → 实际占用8字节&#xff08;413填充&#xff09;4​静态…