js中async与promise的区别

在 JavaScript 中,asyncPromise 都用于处理异步操作,但它们的用法和语法有一些显著区别。以下是它们的详细对比:


1. 基本定义

Promise

  • Promise 是一个表示异步操作最终结果的对象。
  • 它有三种状态:
    • pending(进行中)
    • fulfilled(已完成)
    • rejected(已拒绝)
  • 使用 .then().catch() 处理异步结果。
const promiseExample = new Promise((resolve, reject) => {
    setTimeout(() => resolve("Success!"), 1000);
});

promiseExample.then(console.log).catch(console.error);

async

  • async 是一种语法糖,用于定义返回 Promise 的函数。
  • 异步代码看起来更像同步代码。
  • 配合 await 使用,可以暂停代码执行,直到 Promise 被解决。
async function asyncExample() {
    return "Success!";
}

asyncExample().then(console.log).catch(console.error);

2. 语法对比

Promise

使用 Promise 通常需要嵌套 .then() 或链式调用,可能会导致代码可读性较差。

const promiseExample = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => resolve("Data fetched"), 1000);
    });
};

promiseExample()
    .then((result) => {
        console.log(result);
        return "Next Step";
    })
    .then(console.log)
    .catch(console.error);

async/await

async/await 让代码看起来更线性和清晰,但需要在 async 函数中使用。

const asyncExample = async () => {
    try {
        const result = await new Promise((resolve) => {
            setTimeout(() => resolve("Data fetched"), 1000);
        });
        console.log(result);
        return "Next Step";
    } catch (error) {
        console.error(error);
    }
};

asyncExample();

3. 错误处理

Promise

使用 .catch() 捕获错误:

const promiseWithError = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => reject("Something went wrong!"), 1000);
    });
};

promiseWithError()
    .then(console.log)
    .catch(console.error); // 捕获错误

async/await

使用 try...catch 捕获错误:

const asyncWithError = async () => {
    try {
        const result = await new Promise((_, reject) => {
            setTimeout(() => reject("Something went wrong!"), 1000);
        });
        console.log(result);
    } catch (error) {
        console.error(error); // 捕获错误
    }
};

asyncWithError();

4. 嵌套问题

Promise

嵌套多个异步操作时可能会导致代码复杂化。

const fetchData = () => Promise.resolve("Data fetched");
const processData = (data) => Promise.resolve(`${data} processed`);

fetchData()
    .then((data) => {
        return processData(data);
    })
    .then((processedData) => {
        console.log(processedData);
    })
    .catch(console.error);

async/await

async/await 避免了嵌套,让代码更简洁。

const fetchData = () => Promise.resolve("Data fetched");
const processData = (data) => Promise.resolve(`${data} processed`);

const asyncWorkflow = async () => {
    try {
        const data = await fetchData();
        const processedData = await processData(data);
        console.log(processedData);
    } catch (error) {
        console.error(error);
    }
};

asyncWorkflow();

5. 并发操作

Promise

可以使用 Promise.all 处理并发任务:

const task1 = () => Promise.resolve("Task 1 complete");
const task2 = () => Promise.resolve("Task 2 complete");

Promise.all([task1(), task2()]).then(console.log);

async/await

async 函数中也可以使用 Promise.all 处理并发任务:

const task1 = () => Promise.resolve("Task 1 complete");
const task2 = () => Promise.resolve("Task 2 complete");

const asyncConcurrent = async () => {
    const results = await Promise.all([task1(), task2()]);
    console.log(results);
};

asyncConcurrent();

6. 返回值

Promise

Promise 的返回值需要通过 .then() 获取。

const promiseExample = () => Promise.resolve("Data fetched");

promiseExample().then(console.log);

async

async 函数的返回值本质上是一个 Promise,可以通过 .then()await 获取。

const asyncExample = async () => "Data fetched";

asyncExample().then(console.log);

总结对比

特性Promiseasync/await
定义异步操作的核心 APIPromise 的语法糖
可读性链式调用可能导致复杂代码更接近同步代码,可读性强
错误处理.catch()try...catch
并发处理使用 Promise.all结合 Promise.all 或多个 await
嵌套问题可能出现链式嵌套避免嵌套,更清晰
返回值直接返回 Promise 对象返回 Promise,但看起来像返回普通值

何时使用?

  • 使用 Promise 当你需要处理简单的异步任务或链式调用时。
  • 使用 async/await 当你需要编写复杂的异步逻辑,且希望代码更直观时。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式 UI 开发的开源项目推荐

嵌入式开发 UI 难吗?你的痛点我懂!作为嵌入式开发者,你是否也有以下困扰?设备资源太少,功能和美观只能二选一?调试效率低,每次调整都要反复烧录和测试?开发周期太长,让你…

CTF--php伪协议结合Base64绕过

Base64绕过 在ctf中,base64是比较常见的编码方式,在做题的时候发现自己对于base64的编码和解码规则不是很了解,并且恰好碰到了类似的题目,在翻阅了大佬的文章后记录一下,对于base64编码的学习和一个工具 base64编码是…

基于Java Springboot电影播放平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

国标GB28181摄像机接入EasyGBS国标GB28181设备管理软件:GB28181-2022媒体传输协议解析

随着信息技术的飞速发展,视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。在这一转变过程中,国标GB28181设备管理软件EasyGBS成为了这场技术变革的重要一环。 GB28181-2022媒体传输协议 媒体传输命令包括实时视音频点播、历史视音频回放/…

Redis-monitor安装与配置

0、前言 压测环境因为隔离原因没法直接查看redis日志跟性能指数,只能通过监控工具查看,使用开源redis-montor监控查看 开源地址: GitCode - 全球开发者的开源社区,开源代码托管平台 1、python环境准备(python -v有的忽略&#xff…

windows basic语言学习笔记,批处理命令的简单使用

BAT学习笔记 前言 Windows 命令行中对参数的大小写不敏感,因此 /D 和 /d 的效果完全一致。 1. 代码1:创建目录并复制文件 源代码: echo off REM 创建目标目录,如果不存在 if not exist "C:\h2" (mkdir "C:\h2&q…

5-对象的访问权限

对象的访问权限知识点 对象的分类 在数据库中,数据库的表、索引、视图、缺省值、规则、触发器等等、都可以被称为数据库对象,其中对象主要分为两类 1、模式(schema)对象:模式对象可以理解为一个存储目录、包含视图、索引、数据类型、函数和…

Java Database Connectivity (JDBC + Servlet)

Java Database Connectivity (JDBC)是一个Java API,用于与数据库进行连接和操作。通过JDBC,Java程序可以与各种关系型数据库进行通信,执行SQL查询、更新数据等操作。 一、Java连接数据库两种方式 ​​​​​ ​​ 二、Java中…

[Realtek sdk-3.4.14b] RTL8197FH-VG新增jffs2分区操作说明

sdk说明 ** Gateway/AP firmware v3.4.14b – Aug 26, 2019**  Wireless LAN driver changes as:  Refine WiFi Stability and Performance  Add 8812F MU-MIMO  Add 97G/8812F multiple mac-clone  Add 97G 2T3R antenna diversity  Fix 97G/8812F/8814B MP issu…

鸿蒙多线程开发——线程间数据通信对象01

1、线程间通信 线程间通信指的是并发多线程间存在的数据交换行为。由于ArkTS语言兼容TS/JS,其运行时的实现与其它所有的JS引擎一样,都是基于Actor内存隔离的并发模型提供并发能力。 对于不同的数据对象,在ArkTS线程间通信的行为是有差异的&…

基于单片机的多功能跑步机控制系统

本设计基于单片机的一种多功能跑步机控制系统。该系统以STM32单片机为主控制器,由七个电路模块组成,分别是:单片机模块、电机控制模块、心率检测模块、音乐播放模块、液晶显示模块、语音控制模块、电源模块。其中,单片机模块是整个…

测试工程师如何在面试中脱颖而出

目录 1.平时工作中是怎么去测的? 2.B/S架构和C/S架构区别 3.B/S架构的系统从哪些点去测? 4.你为什么能够做测试这一行?(根据个人情况分析理解) 5.你认为测试的目的是什么? 6.软件测试的流程&#xff…

PHM技术:基于支持向量机的智能故障诊断 | 行星齿轮箱智能故障诊断

目录 1.数据获取 2.特征提取与选择 3.健康状态识别 1.数据获取 用的行星齿轮箱数据采集自图1中的多级齿轮传动系统实验台中,在实验过程中,分别模拟了8种行星齿轮箱的健康状态,包括正常、第一级太阳轮点蚀、第一级太阳轮齿根裂纹、第一级…

【划分型 DP-约束划分个数】【hard】【阿里笔试】力扣1278. 分割回文串 III

给你一个由小写字母组成的字符串 s,和一个整数 k。 请你按下面的要求分割字符串: 首先,你可以将 s 中的部分字符修改为其他的小写英文字母。 接着,你需要把 s 分割成 k 个非空且不相交的子串,并且每个子串都是回文串…

国标GB28181视频平台EasyCVR视频融合平台H.265/H.264转码业务流程

在当今数字化、网络化的视频监控领域,大中型项目对于视频监控管理平台的需求日益增长,特别是在跨区域、多设备、高并发的复杂环境中。EasyCVR视频监控汇聚管理平台正是为了满足这些需求而设计的,它不仅提供了全面的管理功能,还支持…

相机触发模式

参考自:相机触发模式_硬触发和软触发的区别-CSDN博客 一、图像采集模式分类 相机的图像采集模式分为内触发模式与外触发模式。其中内触发模式包含连续采集、单帧采集两种形式;外触发模式包含软件外触发、硬件外触发。本文以海康相机的软件平台作介绍&a…

【数据结构】【线性表】【练习】反转链表

申明 该题源自力扣题库19&#xff0c;文章内容&#xff08;代码&#xff0c;图表等&#xff09;均原创&#xff0c;侵删&#xff01; 题目 给你单链表的头指针head以及两个整数left和right&#xff0c;其中left<right&#xff0c;请你反转从位置left到right的链表节点&…

Applied Intelligence投稿

一、关于手稿格式&#xff1a; 1、该期刊是一个二区的&#xff0c;模板使用Springer nature格式&#xff0c; 期刊投稿要求&#xff0c;详细期刊投稿指南&#xff0c;大部分按Soringernature模板即可&#xff0c;图片表格声明参考文献命名要求需注意。 2、参考文献&#xff…

【Google Cloud】Private Service Connect 托管式服务

简介 Private Service Connect 是什么 Private Service Connect 是 Google Cloud&#xff08;原名 GCP&#xff09;Virtual Private Cloud&#xff08;VPC&#xff09;的一项功能。 该功能主要用于以下两个场景&#xff1a; 使用私有 IP 访问 Google Cloud 的 API。将用户自…

JDK、MAVEN与IDEA的安装与配置

1.认识JDK、MAVEN与IDEA JDK 提供了编译和运行Java程序的基本环境。Maven 帮助管理项目的构建和依赖。IDEA 提供了一个强大的开发环境&#xff0c;使得编写、调试和运行Java程序更加高效。 2. 安装与环境配置 2.1 官网地址 选择你需要的版本下载&#xff1a; MAVEN下载传送…