js中async与promise的区别

news2024/11/22 10:14:17

在 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 当你需要编写复杂的异步逻辑,且希望代码更直观时。

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

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

相关文章

解析与修复vcruntime140_1.dll问题,总结四种vcruntime140_1.dll解决方法

在使用Windows系统的过程中,不少用户可能会遇到与vcruntime140_1.dll相关的问题。这个看似神秘的文件,其实在很多软件的运行中扮演着至关重要的角色。今天的这篇文章将教大家四种vcruntime140_1.dll解决方法。 一、vcruntime140_1.dll文件分析 &#xf…

django基于django的民族服饰数据分析系统的设计与实现

摘 要 随着网络科技的发展,利用大数据分析对民族服饰进行管理已势在必行;该平台将帮助企业更好地理解服饰市场的趋势,优化服装款式,提高服装的质量。 本文讲述了基于python语言开发,后台数据库选择MySQL进行数据的存储…

如何使用GPT API 自定义 自己的 RAG

要使用 GPT 的 API 实现自己的 RAG(Retrieval-Augmented Generation) 系统,可以结合检索工具和 GPT 模型,将外部知识库中的信息与生成模型结合起来,完成准确、高效的任务。以下是具体步骤和实现方法: 系统架…

对subprocess启动的子进程使用VSCode python debugger

文章目录 1 情况概要(和文件结构)2 具体设置和启动步骤2.1 具体配置Step 1 针对attach debugger到子进程Step 2 针对子进程的暂停(可选) Step 3 判断哪个进程id是需要的子进程 2.2 启动步骤和过程 3 其他问题解决3.13.2 ptrace: Operation not permitted…

cocos creator 3.8 一些简单的操作技巧,材质的创建 1

这是一个飞机的3D模型与贴图 导入到cocos中,法线模型文件中已经包含了mesh、material、prefab,也就是模型、材质与预制。界面上创建一个空节点Plane,将模型直接拖入到Plane下。新建材质如图下 Effect属性选择builtin-unlit,不需…

基于web的音乐网站(Java+SpringBoot+Mysql)

目录 1系统概述 1.1 研究背景 1.2研究目的 1.3系统设计思想 2相关技术 2.1 MYSQL数据库 2.2 B/S结构 2.3 Spring Boot框架简介 3系统分析 3.1可行性分析 3.1.1技术可行性 3.1.2经济可行性 3.1.3操作可行性 3.2系统性能分析 3.2.1 系统安全性 3.2.2 数据完整性 …

Web中间件漏洞总结——IIS篇

0x01 前言 渗透过程中会遇到各种中间件,某些中间件版本存在远程执行、任意文件上传等漏洞。本文对IIS相关漏洞进行整理,方便我们在渗透过程中快速查阅IIS漏洞。文章粗略浅显,适合刚入行的新手观看。 0x02 目录 IIS6.0 PUT漏洞IIS6.0 远程代…

关于中断向量表中没有EXTIx_IRQHandler的问题

如果你在中断向量表查找中断向量服务函数时,没有查找到EXTI7_IRQHandler等,是因为中断向量中根本就没有这个函数。 STM32 的中断向量表通常由启动文件(如 startup_stm32f1xx.s)定义。在该文件中,所有的中断服务例程&a…

idea启动服务报错Application run failed

现象是这样,在宝兰德部署报错: NoClassDefFoundError: org/apache/tomcat/util/codec/binary/Base64 本地启动报错:Application run failed:Failed to parse configuration class [***.WebApplication]; nested exception is java.lang.Illeg…

Easyexcel(4-模板文件)

相关文章链接 Easyexcel(1-注解使用)Easyexcel(2-文件读取)Easyexcel(3-文件导出)Easyexcel(4-模板文件) 文件导出 获取 resources 目录下的文件,使用 withTemplate 获…

神经网络问题之:梯度不稳定

梯度不稳定是深度学习中,特别是在训练深度神经网络时常见的一个问题,其本质涉及多个方面。 一、根本原因 梯度不稳定问题的根本原因在于深度神经网络的结构和训练过程中的一些固有特性。随着网络层数的增加,梯度在反向传播过程中会逐层累积变…

动态规划子数组系列一>等差数列划分

题目&#xff1a; 解析&#xff1a; 代码&#xff1a; public int numberOfArithmeticSlices(int[] nums) {int n nums.length;int[] dp new int[n];int ret 0;for(int i 2; i < n; i){dp[i] nums[i] - nums[i-1] nums[i-1] - nums[i-2] ? dp[i-1]1 : 0;ret dp[i…

RedHat系统配置静态IP

1、执行nmtui命令进入字符配置界面如下图所示 2、选择编辑连接进入 3、选择编辑进入后&#xff0c;将IPv4设置为手动模式后&#xff0c;选择显示后进行ip地址、网关、DNS的配置&#xff0c;配置完成后选择确定退出编辑 4、进入主界面后选择启用连接进入后&#xff0c;选择启用&…

batchnorm与layernorn的区别

1 原理 简单总结&#xff1a; batchnorn 和layernorm是在不同维度上对特征进行归一化处理。 batchnorm在batch这一维度上&#xff0c; 对一个batch内部所有样本&#xff0c; 在同一个特征通道上进行归一化。 举个例子&#xff0c; 假设输入的特征图尺寸为16x224x224x256&…

【Redis】持久化机制RDB与AOF

一、RDB RDB模式是就是将内存中的数据存储到磁盘中&#xff0c;等到连接断开的时候会进行持久化操作。但是如果服务器宕机&#xff0c;会导致这个持久化机制不会执行&#xff0c;但是内存中的文件会直接丢失。所以可以设置一个触发机制&#xff0c;save 60 1000 就是代表60秒 执…

JSON,事件绑定

文章目录 JSON事件绑定输入框input和div的内容返回获取dom元素数组还是单个对象for循环为什么要写const那一行&#xff0c;直接写 hobbys[index].checked true;可以吗const不是常量吗&#xff0c;为什么用const声明的element的属性值可以改变&#xff1f; 黑马学习笔记 JSON 定…

Kotlin Multiplatform 未来将采用基于 JetBrains Fleet 定制的独立 IDE

近期 Jetbrains 可以说是动作不断&#xff0c;我们刚介绍了 IntelliJ IDEA 2024.3 K2 模式发布了稳定版支持 &#xff0c;而在官方最近刚调整过的 Kotlin Multiplatform Roadmap 优先关键事项里&#xff0c;可以看到其中就包含了「独立的 Kotlin Multiplatform IDE&#xff0c;…

并行优化策略

并行优化策略汇总 并行优化策略 数据并行&#xff08;DP&#xff09; 将数据集分散到m个设备中&#xff0c;进行训练。得到训练数据后在进行allreduce操作。确保每个worker都有相同模型参数。 整体流程如下 若干块计算GPU&#xff0c;如图中GPU0~GPU2&#xff1b;1块梯度收集…

解决 Android 单元测试 No tests found for given includes:

问题 报错&#xff1a; Execution failed for task :testDebugUnitTest. > No tests found for given includes: 解决方案 1、一开始以为是没有给测试类加public修饰 2、然后替换 Test 注解的包可以解决&#xff0c;将 org.junit.jupiter.api.Test 修改为 org.junit.Tes…

知识见闻 - 数学: 均方根 Root Mean Square

What is Root Mean Square (RMS)? 在统计学上&#xff0c;均方根&#xff08;RMS&#xff09;是均方的平方根&#xff0c;而均方是一组数值的平方的算术平均数。均方根也称为二次均值&#xff0c;是指数为 2 的广义均值的一种特例。均方根也被定义为基于一个周期内瞬时值的平方…