promis(resolve,reject)入门级别

news2025/4/28 10:53:12

JavaScript Promise 的定义

Promise 是一种用于处理异步操作的对象,表示一个可能已经完成或者尚未完成的操作的结果。它的核心作用在于简化复杂的回调嵌套问题(即所谓的“回调地狱”),使异步代码更加清晰易读。

Promise 的状态

Promise 对象具有三种主要状态:

  1. Pending(等待态): 初始状态,在此状态下,异步操作还未完成。
  2. Fulfilled(已成功态): 异步操作已完成,并返回了一个结果。
  3. Rejected(已失败态): 异步操作失败,并抛出了错误信息。

这些状态的变化是单向的,意味着一旦进入 Fulfilled 或 Rejected 状态,则无法再改变其状态。


使用 Promise 的原因

传统的 JavaScript 异步编程通常依赖于回调函数来处理结果。然而,当多个异步调用相互依赖时,容易形成深层嵌套的回调结构,这不仅降低了代码的可读性,还增加了调试难度。Promise 提供了一种更优雅的方式来管理这种复杂性:

  1. 链式调用:通过 .then() 方法可以轻松实现方法链,从而避免深层次的回调嵌套。
  2. 错误处理统一化:可以通过 .catch() 统一捕获整个链条中的任何异常,而不需要在每个回调中单独处理错误。
  3. 更好的控制流:Promise 支持 async/await 语法糖,进一步提升了异步代码的表现力和简洁度。

以下是基于 Promise 实现的一个简单例子,展示如何利用它来处理异步逻辑:

const fetchData = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            const data = "模拟的数据";
            if (data) {
                resolve(data);
            } else {
                reject("获取数据失败");
            }
        }, 1000);
    });
};

fetchData()
    .then(result => console.log(`成功接收到数据: ${result}`))
    .catch(error => console.error(`发生错误: ${error}`));

在这个示例中,fetchData 函数返回的是一个 Promise 对象。如果一切正常,会触发 resolve 并传递成功的数据;如果有误,则触发 reject 来报告错误消息。


总结

Promise 不仅提供了一种标准化的方式去表达异步行为,而且极大地改善了开发者编写和维护异步代码的能力。无论是简单的延迟加载还是复杂的 API 调用场景,都可以借助 Promise 更加高效地解决问题。

在这里插入图片描述

在 JavaScript 中,new Promise 是创建一个新的 Promise 对象的方式。其基本语法结构如下:

const myPromise = new Promise((resolve, reject) => {
    // 执行异步操作或其他逻辑
    if (/* 条件满足 */) {
        resolve(value); // 将 Promise 状态改为 fulfilled 并传递成功值
    } else {
        reject(error); // 将 Promise 状态改为 rejected 并传递错误原因
    }
});
resolvereject 的作用
  • resolve 函数
    当异步操作成功完成时,调用 resolve 可以将 Promise 的状态从 pending 改为 fulfilled,并可以向后续的 .then() 方法传递成功的数据。

  • reject 函数
    如果异步操作失败,则可以通过调用 rejectPromise 的状态从 pending 改为 rejected,并可向后续的 .catch() 或者 .then(null, rejectionHandler) 方法传递错误信息。

使用场景分析
场景一:处理 HTTP 请求

当发起网络请求时,通常会使用 Promise 处理响应的成功或失败情况。例如通过 fetch API 获取远程资源:

function fetchData(url) {
    return new Promise((resolve, reject) => {
        fetch(url)
            .then(response => {
                if (!response.ok) { // 判断响应是否正常
                    reject(new Error(`HTTP error! status: ${response.status}`));
                } else {
                    resolve(response.json()); // 解析 JSON 数据并返回给 then()
                }
            })
            .catch(err => reject(err)); // 捕获 fetch 错误并拒绝 Promise
    });
}

// 调用示例
fetchData('https://api.example.com/data')
    .then(data => console.log('Success:', data))
    .catch(error => console.error('Error:', error.message));

在这个例子中,如果服务器返回的状态码不正常(如 404),则调用 reject 抛出异常;反之,解析成功后调用 resolve 返回数据。

场景二:模拟延迟加载

有时需要模拟某些耗时的操作,比如等待几秒钟后再继续执行下一步动作:

function delay(ms) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            const success = Math.random() > 0.5;
            if (success) {
                resolve('Operation completed successfully');
            } else {
                reject('An unexpected error occurred');
            }
        }, ms);
    });
}

delay(2000).then(message => console.log(message)).catch(error => console.error(error));

这里随机决定是否触发 resolvereject,从而测试不同的回调路径。


总结

新建 Promise 主要用于封装具有不确定性结果的任务流程控制机制。其中核心在于利用 executor 函数内的两个参数——resolvereject 完成对最终状态设定工作。前者代表任务顺利完成后的行为模式定义,后者则是针对可能出现的各种问题提供反馈渠道。

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/202307240241在这里插入图片描述

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

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

相关文章

w~嵌入式C语言~合集6

我自己的原文哦~ https://blog.51cto.com/whaosoft/13870384 一、开源MCU简易数字示波器项目 这是一款采用STC8A8K MCU制造的简单示波器,只有零星组件,易于成型。这些功能可以涵盖简单的测量: 该作品主要的规格如下: 单片机…

学习海康VisionMaster之路径提取

一:进一步学习了 今天学习下VisionMaster中的路径提取:可在绘制的路径上等间隔取点或查找边缘点 二:开始学习 1:什么是路径提取? 相当于事先指定一段路径,然后在对应的路径上查找边缘,这个也是…

第35课 常用快捷操作——用“鼠标左键”拖动图元

概述 拖动某个图元,是设计过程中常需要用到的操作,我们可以在原理图中拖动某个元器件符号,也可以在PCB图中拖动某个焊盘。 和常用的软件类似,用按住鼠标左键的方式来完成拖动操作。 用鼠标左键拖动图元 在想要拖动的图元上&…

二、Web服务常用的I/O操作

一、单个或者批量上传文件 前端&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>文件…

「Mac畅玩AIGC与多模态04」开发篇01 - 创建第一个 LLM 对话应用

一、概述 本篇介绍如何在 macOS 环境下&#xff0c;基于已部署完成的 Dify 平台和本地 LLM 模型&#xff08;如 DeepSeek&#xff09;&#xff0c;创建并测试第一个基础对话应用&#xff0c;实现快速验证推理服务与平台交互功能。 二、应用创建流程 1. 通过首页创建应用 打…

深度探究获取淘宝商品数据的途径|API接口|批量自动化采集商品数据

在电商行业竞争日益激烈的今天&#xff0c;淘宝商品数据如同蕴藏巨大价值的宝藏&#xff0c;无论是商家进行竞品分析、优化商品策略&#xff0c;还是数据分析师挖掘市场趋势&#xff0c;都离不开对这些数据的获取与分析。本文将深入探讨获取淘宝商品数据的多种途径&#xff0c;…

马哥教育Linux云计算运维课程

课程大小&#xff1a;19.1G 课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/90640128 更多资源下载&#xff1a;关注我 你是否找了很多资料看了很多视频聊了很多群友&#xff0c;却发现自己技术仍然原地踏步&#xff1f;本教程联合BAT一线导师倾囊相授…

FPGA与边缘AI:计算革命的前沿力量

在数字化转型浪潮中&#xff0c;边缘计算和人工智能正引领着技术革命。而FPGA&#xff08;现场可编程门阵列&#xff09;作为一种独特的硬件架构&#xff0c;正逐渐成为边缘AI领域的关键推动力。本文将探讨FPGA与边缘AI的结合如何重塑我们的数字世界&#xff0c;以及这一技术融…

Kafka 架构设计和组件介绍

什么是Apache Kafka&#xff1f; Apache Kafka 是一个强大的开源分布式事件流平台。它最初由 LinkedIn 开发&#xff0c;最初是一个消息队列&#xff0c;后来发展成为处理各种场景数据流的工具。 Kafka 的分布式系统架构支持水平扩展&#xff0c;使消费者能够按照自己的节奏检…

【Node.js 】在Windows 下搭建适配 DPlayer 的轻量(简陋)级弹幕后端服务

一、引言 DPlayer官网&#xff1a;DPlayer 官方弹幕后端服务&#xff1a;DPlayer-node MoePlayer/DPlayer-node&#xff1a;使用 Docker for DPlayer Node.js 后端&#xff08;https://github.com/DIYgod/DPlayer&#xff09; 本来想直接使用官网提供的DPlayer-node直接搭建…

OpenSSH配置连接远程服务器MS ODBC驱动与Navicat数据库管理

OpenSSH配置连接远程服务器MS ODBC驱动与Navicat数据库管理 目录 OpenSSH配置连接远程服务器MS ODBC驱动与Navicat数据库管理 一、MS ODBC驱动 1.1、安装到Windows后的表现形式 1.2、版本的互斥性 1.3、安装程序 1.4、配置后才可用 二、Navicat数据库管理工具 2.1、安…

操作系统:计算机世界的基石与演进

一、操作系统的本质与核心功能 操作系统如同计算机系统的"总管家"&#xff0c;在硬件与应用之间架起关键桥梁。从不同视角观察&#xff0c;其核心功能呈现多维价值&#xff1a; 硬件视角的双重使命&#xff1a; 硬件管理者&#xff1a;通过内存管理、进程调度和设…

Codeium 免费的AI编程助手

Codeium 由 Exafunction 团队&#xff08;主要也是美国华人&#xff09;开发的一款免费AI编程助手&#xff0c;是一个建立在顶尖AI技术上的代码加速工具&#xff0c;其背后的老板非常厉害&#xff0c;据说投资过马斯克的SpaceX。Codeium 本身具有颇多的亮点&#xff0c;支持70种…

在MySQL Shell里 重启MySQL 8.4实例

前一段时间看到MySQL官方视频的Oracle工程师在mysql shell里面重启mysql实例&#xff0c;感觉这个操作很方便&#xff0c;所以来试试&#xff0c;下面为该工程师的操作截图 1.MySQL Shell 通过root用户连上mysql&#xff0c;shutdown mysql实例 [rootmysql8_3 bin]# mysqlshMy…

FANUC机器人GI与GO位置数据传输设置

FANUC机器人GI与GO位置数据传输设置&#xff08;整数小数分开发&#xff09; 一、概述 在 Fanuc 机器人应用中&#xff0c;如果 IO 点位足够&#xff0c;可以利用机器人 IO 传输位置数据及偏移位置数据等。 二、操作步骤 1、确认通讯软件安装 首先确认机器人控制柜已经安装…

LeetCode 24 两两交换链表中的节点

​给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#xff1a;[2,1…

低代码平台开发手机USB-HID调试助手

项目介绍 USB-HID调试助手是一种专门用于调试和测试USB-HID设备的软件工具。USB-HID设备是一类通过USB接口与计算机通信的设备&#xff0c;常见的HID设备包括键盘、鼠标、游戏控制器、以及一些专用的工业控制设备等。 主要功能包括&#xff1a; 数据监控&#xff1a;实时监控和…

亚组风险比分析与可视化

1. 结果解读 1.1 风险比概述 1.1.1 风险比基本概念 风险比(Hazard Ratio)用于衡量治疗组与对照组事件发生的风险差异。 风险比为1,表示两组风险相同;小于1,治疗组风险低;大于1,治疗组风险高。 1.1.2 性别亚组分析 A性风险比小于1,表明治疗对A性有积极效果,风险降低。…

【博客系统】博客系统第一弹:博客系统项目配置、MyBatis-Plus 实现 Mapper 接口、处理项目公共模块:统一返回结果、统一异常处理

案例综合练习 - 博客系统 本节目标 从 0 到 1 完成博客系统后端项目的开发。 前言 通过前面课程的学习&#xff0c;我们掌握了 Spring 框架和 MyBatis 的基本使用&#xff0c;并完成了图书管理系统的常规功能开发。接下来我们系统地从 0 到 1 完成一个项目的开发。 项目介绍 …

基于OpenMV+STM32+OLED与YOLOv11+PaddleOCR的嵌入式车牌识别系统开发笔记

基于OpenMV、STM32与OLED的嵌入式车牌识别系统开发笔记 基于OpenMV、STM32与OLED的嵌入式车牌识别系统开发笔记系统架构全景 一、实物演示二、OpenMV端设计要点1. 硬件配置优化2. 智能帧率控制算法3. 数据传输协议设计 三、PyTorch后端核心实现&#xff1a;YOLOv11与PaddleOCR的…