Promise 的常见使用场景

异步操作序列化

当有多个异步操作需要按顺序执行时,Promise 可以将它们串联起来,确保每个操作完成后下一个才开始。例如,先从服务器获取用户数据,再根据用户数据去获取其他相关信息:

function getUserData(userId) {
  return new Promise((resolve, reject) => {
    // 模拟异步获取用户数据
    setTimeout(() => {
      resolve({ id: userId, name: '张三' });
    }, 1000);
  });
}

function getRelatedInfo(userData) {
  return new Promise((resolve, reject) => {
    // 模拟根据用户数据获取其他信息
    setTimeout(() => {
      resolve({ userId: userData.id, info: '用户的相关信息' });
    }, 1000);
  });
}

getUserData(1)
  .then(userData => {
    console.log('获取到用户数据:', userData);
    return getRelatedInfo(userData);
  })
  .then(relatedInfo => {
    console.log('获取到相关用户信息:', relatedInfo);
  });

并行执行多个异步操作

如果多个异步操作之间没有依赖关系,可以使用 Promise.all() 同时启动它们,等待所有操作完成后统一处理结果。例如,同时获取多个 API 的数据:

function getApi1Data() {
  return new Promise(resolve => {
    setTimeout(() => resolve('API1 的数据'), 1000);
  });
}

function getApi2Data() {
  return new Promise(resolve => {
    setTimeout(() => resolve('API2 的数据'), 1500);
  });
}

Promise.all([getApi1Data(), getApi2Data()])
  .then(results => {
    console.log('API1 数据:', results[0]);
    console.log('API2 数据:', results[1]);
  });

异步操作超时处理

在某些情况下,可能需要为异步操作设置超时时间,如果超过时间未完成则视为失败。Promise 可以结合 setTimeout 实现这一功能:

function fetchDataWithTimeout(url, timeout) {
  return Promise.race([
    fetch(url),
    new Promise((_, reject) => {
      setTimeout(() => {
        reject(new Error('请求超时'));
      }, timeout);
    })
  ]);
}

fetchDataWithTimeout('https://example.com/api/data', 3000)
  .then(response => console.log('获取数据成功:', response))
  .catch(error => console.error('获取数据失败:', error));

异步操作错误处理

Promise 提供了集中处理异步操作错误的机制,通过.catch() 方法可以捕获整个 Promise 链中的任何错误。例如:

function fetchData(url) {
  return new Promise((resolve, reject) => {
    // 模拟异步获取数据,可能出现错误
    setTimeout(() => {
      const data = { url: url, content: '数据内容' };
      if (data.content) {
        resolve(data);
      } else {
        reject(new Error('数据获取失败'));
      }
    }, 1000);
  });
}

fetchData('https://example.com/api/data')
  .then(data => {
    console.log('获取数据成功:', data);
    // 故意抛出错误,模拟后续处理出错
    throw new Error('处理数据时出错');
  })
  .catch(error => {
    console.error('发生错误:', error);
  });

资源预加载

在 Web 开发中,常需要预加载图片、音频等资源,Promise 可以用于跟踪资源加载状态。例如:

function preloadImage(src) {
  return new Promise((resolve, reject) => {
    const img = new Image();
    img.onload = () => resolve(img);
    img.onerror = () => reject(new Error(`图片加载失败: ${src}`));
    img.src = src;
  });
}

preloadImage('https://example.com/image.jpg')
  .then(img => console.log('图片加载完成:', img))
  .catch(error => console.error('图片加载错误:', error));

定时器操作

在需要延迟执行某些操作或创建定时器时,Promise 也可以发挥作用。例如,创建一个延迟一定时间后 resolve 的 Promise:

function delay(time) {
  return new Promise(resolve => {
    setTimeout(resolve, time);
  });
}

delay(2000)
  .then(() => {
    console.log('延迟 2 秒后执行');
  });

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

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

相关文章

【解决哈希冲突】

哈希冲突 如果两个不同的 key 通过哈希函数得到了相同的索引,这种情况就叫做「哈希冲突」。 哈希冲突不可能避免,只能在算法层面妥善处理出现哈希冲突的情况。 哈希冲突是一定会出现的,因为这个 hash 函数相当于是把一个无穷大的空间映射到…

基于LabVIEW的脚本化子VI动态生成

该示例展示了一种利用LabVIEW VI脚本(VI Scripting)技术,通过程序化方式动态生成并替换子VI的解决方案。核心逻辑为:基于预定义的模板VI,根据用户选择的数学操作(加法或乘法),自动生…

谷歌AI最新发布的可微分逻辑元胞自动机(DiffLogic CA)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

如何使用Postman,通过Mock的方式测试我们的API

这篇文章将教会大家如何利用 postman,通过 Mock 的方式测试我们的 API。 什么是 Mock Mock 是一项特殊的测试技巧,可以在没有依赖项的情况下进行单元测试。通常情况下,Mock 与其他方法的主要区别就是,用于取代代码依赖项的模拟对…

pytest基础知识

pytest知识了解 pytest的基础知识了解:Python测试框架之pytest详解_lovedingd的博客-CSDN博客_pytest框架 (包含设置断点,pdb,获取最慢的10个用例的执行耗时) pytest-pytest.main()运行测试用例,pytest参数: pytest-…

LM Studio 替换源的方式解决huggingface.co无法访问的问题

安装软件完成之后,不要打开,打开了就直接关闭 在安装目录下,比如我安装在E:\Program Files\LM Studio 下面三个文件中的huggingface.co全部替换为hf-mirror.com然后再打开即可。 E:\Program Files\LM Studio\resources\app\.webpack\rende…

【含文档+PPT+源码】基于微信小程序的乡村振兴民宿管理系统

项目介绍 本课程演示的是一款基于微信小程序的乡村振兴民宿管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该…

五、OpenGL中Shader与C++数据传输

文章目录 一、概述二、Shader 代码文件的基本格式三、Shader的向量语法介绍四、Shader之间的数据传输五、Shader与C的数据传输uniform六、完整示例 一、概述 在 OpenGL 中,Shader(着色器)使用 GLSL(OpenGL Shading Language&…

docker不停机部署

背景 最近做大疆项目时,后台更新部署时,机场和无人机就会掉线。设备自动重连注册时间比较长,应用长时间不可用。所以需要灰色发布服务。docker-compose的swarm模式可解决此问题。 服务构建脚本Dockerfile # 使用官方Java基础镜像&#xff…

工作记录 2016-12-22

工作记录 2016-12-22 更新的问题 1、修改了Job Summary的Bill Amount的Bug。 2、修改了Account #的宽度。 3、修改了Clearinghouse Status的默认查询的条件。 4、修改了Upload Files的Add File的bug。 5、Pending Pool、Missing Infos加了Write Off,修改了Histor…

QLoggingCategory类使用

QLoggingCategory类使用 QLoggingCategory的概述 QLoggingCategory是Qt的日志策略类;可以通过声明不同的日志策略对象来输出不同的日志信息。打印信息类型如下:宏 Q_DECLARE_LOGGING_CATEGORY(name) 定义一个返回QLoggingCategory对象函数,…

Linux红帽:RHCSA认证知识讲解(五)从红帽和 DNF 软件仓库下载、安装、更新和管理软件包

Linux红帽:RHCSA认证知识讲解(五)从红帽和 DNF 软件仓库下载、安装、更新和管理软件包 前言一、DNF 软件包管理基础1.1 核心操作命令安装软件包卸载软件包重新安装软件包 1.2 软件仓库原理 二、配置自定义软件仓库步骤 1:清理默认…

Go本地缓存设计与实现

本地缓存是一个项目中很常见的组件。在很多人的眼中就是一个简单的key-value的map存储即可实现,但实际上,设计一个本地缓存需要考虑的问题远比你想象的多,比如说,本地缓存是将数据存储在内存,若数据量激增突破了内存限…

通义万相2.1开源版本地化部署攻略,生成视频再填利器

2025 年 2 月 25 日晚上 11:00 通义万相 2.1 开源发布,前两周太忙没空搞它,这个周末,也来本地化部署一个,体验生成效果如何,总的来说,它在国内文生视频、图生视频的行列处于领先位置&#xff0c…

Jetson Xavier NX安装CUDA加速的OpenCV

我们使用SDKManager刷机完成后,使用jtop查看,发现OpenCV 是不带CUDA加速的,因此,我们需要安装CUDA加速的OpenCV,这样后续在使用的时候速度会快很多。 首先我们先卸载默认OpenCV sudo apt purge libopencv* -y sudo …

基于PaddleNLP使用DeepSeek-R1搭建智能体

基于PaddleNLP使用DeepSeek-R1搭建智能体 最近在学习DeepSeek,找到了PaddleNLP星河社区大模型,跟着敲写了一遍。内容来源:DeepSeek实战训练营:从云端模型部署到应用开发 - 飞桨AI Studio星河社区-人工智能学习与实训社区 本项目基…

给大家推荐8个好玩有趣的网站

1、Home Apothecary 家庭药房 https://apothecary.tips/zh Home Apothecary(家庭药房)结合传统中医智慧与现代科学验证,提供涵盖睡眠改善、免疫力提升、肠胃调理、活力增强等健康需求的天然养生饮品配方。精选安神助眠、四季调养、舒缓压力…

使用Beanshell前置处理器对Jmeter的请求body进行加密

这里我们用HmacSHA256来进行加密举例: 步骤: 1.先获取请求参数并对请求参数进行处理(处理成String类型) //处理请求参数的两种方法: //方法一: //获取请求 Arguments args sampler.getArguments(); //转…

利用paddleocr解决图片旋转问题

由于之前使用easyocr识别图片的时候发现旋转的图片或者倒置的图片效果很差,来利用 cv2.minAreaRect()获取旋转角度,只能解决0-90,对于倒置的图片不能很好解决,因此使用paddleocr中方向分类检测(只能返回0,1…

数据结构(蓝桥杯常考点)

数据结构 前言:这个是针对于蓝桥杯竞赛常考的数据结构内容,基础算法比如高精度这些会在下期给大家总结 数据结构 竞赛中,时间复杂度不能超过10的7次方(1秒)到10的8次方(2秒) 空间限制&#x…