从0开始学习JavaScript--JavaScript使用Promise

news2024/11/23 12:48:01

JavaScript中的异步编程一直是开发中的重要话题。传统的回调函数带来了回调地狱和代码可读性的问题。为了解决这些问题,ES6引入了Promise,一种更现代、更灵活的异步编程解决方案。本文将深入探讨JavaScript中如何使用Promise,通过丰富的示例代码演示Promise的基本概念、链式调用、错误处理等方面的用法,帮助大家更全面地理解和应用Promise。

1. Promise的基本概念

Promise是一个表示异步操作最终完成或失败的对象。它是ES6中新增的一个构造函数,具有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。

// 示例:Promise的基本概念
let myPromise = new Promise((resolve, reject) => {
  // 异步操作
  let isSuccess = true;

  if (isSuccess) {
    resolve("Operation successful");
  } else {
    reject("Operation failed");
  }
});

myPromise
  .then((result) => {
    console.log(result); // 输出:Operation successful
  })
  .catch((error) => {
    console.error(error); // 输出:Operation failed
  });

在这个例子中,创建了一个简单的Promise实例,根据异步操作的结果调用resolvereject。然后通过.then().catch()处理成功和失败的情况。

2. 链式调用

Promise的优势之一是支持链式调用,通过.then()方法将多个异步操作连接在一起,增强了代码的可读性。

// 示例:链式调用
function fetchData() {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve({ data: "Some data" });
    }, 1000);
  });
}

fetchData()
  .then((result) => {
    console.log(result); // 输出:{ data: 'Some data' }
    return result.data;
  })
  .then((data) => {
    console.log(`Processed data: ${data}`); // 输出:Processed data: Some data
  });

在这个例子中,fetchData()返回一个Promise实例,通过.then()方法处理异步操作的结果,并将结果传递给下一个.then()

3. Promise.all()

Promise.all()接收一个包含多个Promise的可迭代对象,并在所有Promise都成功时才成功,任意一个Promise失败则整体失败。

// 示例:Promise.all()
let promise1 = Promise.resolve("Promise 1");
let promise2 = new Promise((resolve) => setTimeout(() => resolve("Promise 2"), 2000));
let promise3 = fetch("https://api.example.com/data");

Promise.all([promise1, promise2, promise3])
  .then((results) => {
    console.log(results); // 输出:['Promise 1', 'Promise 2', Response]
  })
  .catch((error) => {
    console.error(error); // 输出:如果有任意一个Promise失败
  });

在这个例子中,Promise.all()等待所有传入的Promise完成,然后返回一个包含所有结果的新Promise。

4. Promise.race()

Promise.race()同样接收一个包含多个Promise的可迭代对象,但只要有一个Promise完成或失败,整体就完成或失败。

// 示例:Promise.race()
let racePromise1 = new Promise((resolve) => setTimeout(() => resolve("Race Promise 1"), 1000));
let racePromise2 = new Promise((resolve) => setTimeout(() => resolve("Race Promise 2"), 2000));

Promise.race([racePromise1, racePromise2])
  .then((result) => {
    console.log(result); // 输出:Race Promise 1
  })
  .catch((error) => {
    console.error(error); // 不会执行
  });

在这个例子中,Promise.race()返回一个新Promise,它会在第一个Promise完成或失败时完成或失败。

5. 错误处理

Promise通过.catch()方法提供了一种集中处理错误的方式,使得错误处理更为清晰。

// 示例:错误处理
function throwError() {
  return new Promise((resolve, reject) => {
    reject("An error occurred");
  });
}

throwError()
  .then((result) => {
    console.log(result); // 不会执行
  })
  .catch((error) => {
    console.error(error); // 输出:An error occurred
  });

在这个例子中,throwError()返回一个Promise,并通过.catch()捕获了错误。

6. async/await与Promise

ES2017引入了asyncawait关键字,使得异步代码更像同步代码,更容易理解和维护。

// 示例:async/await与Promise
function fetchData() {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve("Async data");
    }, 1000);
  });
}

async function fetchDataAsync() {
  try {
    let result = await fetchData();
    console.log(result); // 输出:Async data
  } catch (error) {
    console.error(error); // 不会执行
  }
}

fetchDataAsync();

在这个例子中,fetchDataAsync()使用async标记,内部使用await等待Promise完成,使得异步代码看起来更加同步。

总结

Promise是JavaScript中处理异步编程的一种现代解决方案,通过简洁的语法和丰富的方法提供了更好的编程体验。通过本文的介绍,读者应该对Promise的基本概念、链式调用、Promise.all()Promise.race()、错误处理以及与async/await的结合有了更全面的了解。

未来,随着JavaScript语言的发展,异步编程的解决方案可能会进一步演进,但Promise作为当前主流的解决方案,将在很长一段时间内继续发挥着重要作用。

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

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

相关文章

试用无线调试器PowerDebugger小记

试用无线调试器PowerDebugger小记 文章目录 试用无线调试器PowerDebugger小记引言准备软硬件环境PowerDebugger 无线调试器EVB-YTM32B1LE0-Q64 开发板 开始调试小结参考文献 引言 多年前调试智能车时,抱着电脑连着小车在跑道上一边跑一边看数据的经历,让…

vue-awesome-swiper 引入css样式文件报错等问题

引入css样式文件这个错是我最开始就有的错误,因为在安装vue-awesome-swiper 就会默认安装swiper。我指定了vue-awesome-swiper的版本,但是没指定swiper的版本,默认安装版本为8.0.7。 所以在引入css文件的时候报错,在node_modules…

车载毫米波雷达行业发展4——技术

4.1 车载毫米波雷达技术原理 毫米波雷达系统可实现距离测量、速度测量和角度测量三大基本功能。车载毫米波雷达 常用调频连续波(FMCW)雷达,其工作频率随时间做周期性线性变化,能测速和测距,适合做 近距离测量,有较高的测量精度。…

Docker发布简单springboot项目

Docker发布简单springboot项目 在IDEA工具中直接编写Dockerfile文件 FROM java:8COPY *.jar /app.jarCMD ["--server.prot 8080"]EXPOSE 8080ENTRYPOINT ["java", "-jar", "/app.jar"]将项目打包成对应的jar包,将Dockerf…

基于龙格-库塔算法优化概率神经网络PNN的分类预测 - 附代码

基于龙格-库塔算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于龙格-库塔算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于龙格-库塔优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对P…

cpu飙高问题,案例分析(一)

一、复习知识点: CPU性能指标: load average:负载,linux查看的时候,通常显示如下: load average后面有三段数字:代表了系统1分钟,5分钟,15分钟平均负载。 形象的类别可…

CommonModule.dll动态链接库(DLL)文件丢失的处理方法

方法一、手动下载修复 (1)从网站下载commonmodule.dll文件到您的电脑上。 (2)将commonmodule.dll文件复制到" X:\Windows\system32 " (X代表您系统所在目录盘符,如:C:\Windows\system32)目录下。 (3)在开始菜单中找到"运行(R)" 或…

shell 脚本变量

目录 什么是 shell shell 的两种面向对象 shell 脚本概述 脚本 (本质为程序) 脚本的组成 执行脚本 例题 脚本构成 脚本执行逻辑及执行方式 脚本的常见错误 编写 shell 脚本 执行脚本文件的方式 重定向 重定向操作 shell 变量的作用及类型…

智能井盖传感器功能有哪些?

智能井盖传感器是一种集成了多种先进技术的传感器设备,旨在强化城市的公共安全,确保城市基础设施的稳定运作。这种传感器具有多种功能,例如实时监测井盖状态、监测井下气体等是否超出阈值。借助智能井盖传感器,政府和城市管理部门…

C++:拷贝构造函数,深拷贝,浅拷贝

一.什么是拷贝构造函数? 同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制(拷贝)是完全可行的。这个拷贝过程只需要拷贝数据成员,而函数成员是共用的(只有一份拷贝)。在建立对…

1230天,百度再见!!!

从2020年7月8日至2023年11月20日,在百度的工作到达了终点,完成了从学生向职场人的蜕变,是时候说再见了! 一、成长收获 在这1230天里收获颇丰,下面与各位分享一下。 从技术至上到业务赋能的思想转变 相信很多人都存在“…

一个完备的手游地形实现方案

一、地形几何方案:Terrain 与 Mesh 1.1 目前手游主流地形几何方案分析 先不考虑 LOD 等优化手段,目前地形的几何方案选择有如下几种: 使用 Unity 自带的 Terrain使用 Unity 自带的 Terrain,但是等美术资产完成后使用工具转为 M…

键盘快捷键工具Keyboard Maestro mac中文版介绍

Keyboard Maestro mac是一款键盘快捷键工具,它可以帮助用户通过自定义快捷键来快速完成各种操作,提高工作效率。Keyboard Maestro支持多种快捷键组合,包括单键、双键、三键、四键组合等,用户可以根据自己的习惯进行设置。此外&…

全志H616开发版

开发板介绍: 二、开发板刷机 SDFormatter TF卡的格式化工具、Win32Diskimager 刷机工具 刷机镜像为:Orangepizero2_2.2.0_ubuntu_bionic_desktop_linux4.9.170.img 使用MobaXterm_Personal_20.3连接使用 网络配置:nmcli dev wifi 命令接入网…

PLC梯形图实操——风扇正反转

文章目录 1.项目内创建函数块(FB)2.项目内创建数据块(DB)2.1去除优化块访问2.2去除优化块的访问后对数据块进行编译 3.在函数块(FB)内实现正转反转的自锁与互锁3.1在函数块内实现电机正反转的梯形图 4.主函…

Python的os.path.join()详解

当你需要构建文件路径时,os.path.join() 是一个很有用的方法。这个方法会根据你的操作系统使用正确的路径分隔符(例如,在 Windows 上是反斜杠 \,在类 Unix 系统上是正斜杠 /)来连接路径中的各个部分。这样你就可以确保…

Django实战:从零到一构建安全高效的Web应用

目录 一、概述 二、版本控制和部署 1、Git版本控制 2、Docker部署 三、数据库配置 1、配置数据库设置 2、创建数据库模型 四、URL路由和视图 1、定义URL路由 2、创建视图 五、模板渲染 1、创建模板 2、在视图中使用模板 总结 一、概述 Django是一个高级Python W…

HarmonyOS4.0系列——01、下载、安装、配置环境、搭建页面以及运行示例代码

HarmonyOS4.0应用开发 安装编辑器 这里安装windows版本为例 安装依赖 打开DevEco Studio 这八项全部打钩即可开始编写代码,如果存在x,需要安装正确的库即可 开发 点击Create Project 选择默认模板——next Model部分分为Stage和FA两个应用模型&…

[架构之路-247]:目标系统 - 设计方法 - 软件工程 - 结构化方法的基本思想、本质、特点以及在软件开发、在生活中的应用

目录 前言: 一、什么是非结构化方法 1.1 什么是非结构化方法 1.2 非结构化方法的适用场合 二、什么是结构化方法 1.1 结构化方法诞生的背景:软件规模发展:大规模、复杂系统的需要 1.2 概述 1.3 主要特点与核心思想 三、结构化方法在…

Windows 安装 Docker Compose

目录 前言什么是 Docker Compose ?安装 Docker Compose配置环境变量结语开源项目 前言 在当今软件开发和部署领域,容器化技术的应用已成为提高效率和系统可移植性的关键手段。Docker,作为领先的容器化平台,为开发人员提供了轻松构…