【前端每日基础】day26——Promise

在JavaScript中,Promise是一种用于处理异步操作的对象。它允许我们以一种更结构化和更具可读性的方式来处理异步代码,从而避免了回调地狱(callback hell)的问题。以下是对Promise的详细讲解。

Promise 的基础
一个 Promise 对象代表一个异步操作的最终完成(或失败)及其结果值。Promise 对象可以处于以下三种状态之一:

待定(pending):初始状态,既没有被解决(fulfilled),也没有被拒绝(rejected)。
已解决(fulfilled):表示操作成功完成。
已拒绝(rejected):表示操作失败。
创建一个Promise
可以通过 new Promise 构造函数来创建一个新的 Promise 对象。构造函数接收一个执行器函数(executor function),该函数会立即执行,并包含两个参数:resolve 和 reject。这两个参数是函数,用于将Promise的状态从“待定”变为“已解决”或“已拒绝”。

let promise = new Promise((resolve, reject) => {// 异步操作setTimeout(() => {let success = true; // 假设这个变量表示异步操作的结果if (success) {resolve("Operation successful!");} else {reject("Operation failed!");}}, 1000);
});

处理Promise结果
可以使用 then 方法来处理已解决状态的Promise结果,使用 catch 方法来处理已拒绝状态的Promise结果。

promise.then(result => {console.log(result); // 输出 "Operation successful!"
}).catch(error => {console.log(error); // 输出 "Operation failed!"(如果失败)
});

Promise 的方法
then
then 方法接收两个参数:一个用于处理成功结果的回调函数,另一个用于处理失败结果的回调函数。第二个参数是可选的,通常会使用 catch 方法来处理错误。

promise.then(result => console.log(result), // 处理成功结果error => console.log(error)    // 处理失败结果(可选)
);

catch
catch 方法用于处理Promise的拒绝状态,与在 then 方法中提供第二个参数的效果相同。它更常用,因为它使错误处理逻辑更清晰。

promise.then(result => {console.log(result);
}).catch(error => {console.log(error);
});

finally
finally 方法接收一个没有参数的回调函数,无论Promise的状态是已解决还是已拒绝,都会执行这个回调函数。它通常用于清理操作,例如停止加载动画。

promise.finally(() => {console.log("Promise completed (either fulfilled or rejected).");
});

链式调用
Promise的强大之处在于可以通过链式调用来处理一系列的异步操作。每个 then 方法都会返回一个新的Promise对象,这使得我们可以串联多个异步操作。

let promise = new Promise((resolve, reject) => {setTimeout(() => resolve(1), 1000);
});promise.then(result => {console.log(result); // 1return result * 2;
}).then(result => {console.log(result); // 2return result * 3;
}).then(result => {console.log(result); // 6
});

常用的Promise静态方法
Promise.resolve
Promise.resolve 方法返回一个已解决的Promise对象。可以将现有的值转换为Promise对象。

let resolvedPromise = Promise.resolve("Resolved value");
resolvedPromise.then(result => console.log(result)); // 输出 "Resolved value"

Promise.reject
Promise.reject 方法返回一个已拒绝的Promise对象。可以将现有的错误或拒绝原因转换为Promise对象。

let rejectedPromise = Promise.reject("Rejected reason");
rejectedPromise.catch(error => console.log(error)); // 输出 "Rejected reason"

Promise.all
Promise.all 方法接收一个Promise数组,当所有Promise都解决时,返回一个已解决的Promise;如果有一个Promise被拒绝,则返回一个已拒绝的Promise。

let promise1 = Promise.resolve(3);
let promise2 = 42;
let promise3 = new Promise((resolve, reject) => {setTimeout(resolve, 100, 'foo');
});Promise.all([promise1, promise2, promise3]).then(values => {console.log(values); // 输出 [3, 42, 'foo']
}).catch(error => {console.log(error);
});

Promise.race
Promise.race 方法接收一个Promise数组,当第一个Promise解决或拒绝时,返回一个新的Promise。

let promise1 = new Promise((resolve, reject) => {setTimeout(resolve, 500, 'one');
});
let promise2 = new Promise((resolve, reject) => {setTimeout(resolve, 100, 'two');
});Promise.race([promise1, promise2]).then(value => {console.log(value); // 输出 'two',因为promise2更快
});

实际示例
假设我们有一个函数 fetchData,它返回一个Promise,模拟从服务器获取数据:

function fetchData() {return new Promise((resolve, reject) => {setTimeout(() => {let success = true; // 模拟成功或失败if (success) {resolve({ data: "Server data" });} else {reject("Failed to fetch data");}}, 1000);});
}fetchData().then(response => {console.log(response.data); // 输出 "Server data"return response.data;
}).then(data => {console.log("Processing data:", data);return "Processed data";
}).then(result => {console.log(result); // 输出 "Processed data"
}).catch(error => {console.error(error); // 如果有错误,输出错误信息
}).finally(() => {console.log("Fetch operation completed."); // 无论成功或失败都会执行
});

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

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

相关文章

Python编程入门:植物大战僵尸游戏实现

引言: Python是一种简单易学且功能强大的编程语言,非常适合初学者入门。在本篇博客中,我们将通过一个简单的例子来介绍Python的基础语法和面向对象编程的概念。我们将使用Python编写一个植物大战僵尸游戏,并通过代码逐步实现游戏的…

Jmeter元件及基本作用域

🚀从今天开始学习性能测试工具——Jmeter,小梦也是先学习了下Jmeter的元件概念以及其基本的作用域,整理了下笔记,希望不管是从事开发领域还是测试领域的朋友们,我们一起学习下Jmeter工具,提升工作中的技能&…

【软考】下篇 第12章 信息系统架构设计理论与实践

目录 一、信息系统架构的定义二、信息系统架构风格三、信息系统架构分类四、信息系统常用的4种架构模型(SCSB)五、企业信息系统的总体框架ISA六、TOGAF & ADM七、信息化总体架构方法信息化六要素信息化架构模式信息系统生命周期(规分设实…

7个靠谱的副业赚钱方法,宝妈,上班族,学生党可以做的兼职副业

你是否也曾面临过这样的困境:生活费紧张,想要找份兼职来补贴家用或是满足自己的小心愿?别担心,今天我将带领你踏入这个丰富多彩的兼职世界,助你轻松达成月入过千的小目标! 在我漫长的兼职探索旅程中&#…

【区域脑图论文笔记】BrainNetCNN:第一个专门为脑网络连接体数据设计的深度学习框架

【区域脑图论文笔记】BrainNetCNN:第一个专门为脑网络连接体数据设计的深度学习框架 信息概览与提炼采用的数据与结果数据集结果概览一眼 重点图与方法概览核心与优劣总结模型与实验论文方法E2E的理解E2N的理解N2G的理解三个卷积层设计的理解 论文实验与讨论 总结与…

PostgreSQL 详细教程

PostgreSQL是一个强大的开源关系型数据库管理系统,它提供了许多高级功能,包括事务处理、复杂查询和数据完整性。本教程将引导您了解如何安装、配置和使用PostgreSQL。 一、安装PostgreSQL 1. **下载PostgreSQL**:访问PostgreSQL的官方网站&…

力扣232. 用栈实现队列(两栈实现队列)

Problem: 232. 用栈实现队列 文章目录 题目描述思路Code 题目描述 思路 利用两个栈,一个入栈一个出栈搭配着实现队列的相关操作: 1.创建两个栈stack1和stack2; 2.void push(int x):将要入队的元素先入栈stack1; 3.int pop()&…

倒计时 1 天!「飞天技术沙龙-CentOS 迁移替换专场」演讲亮点一览

各位开发者们: 「飞天技术沙龙 - CentOS 迁移替换专场」即将于本周三在北京召开!昨天,小龙为参会者公布了详细参会指南,今天带大家了解各演讲内容亮点。 活动时间:5 月 29 日(本周三) 13:30-17…

是所有的图片都能用Canvas画出来吗?

Canvas不会将图片转换为其他格式进行绘制,它是直接在画布上绘制图片的。Flutter中使用Canvas绘制图片时,可以使用drawImage方法将图片绘制到画布上。 关于图片的格式,Flutter支持多种常见的图片格式,包括但不限于: P…

pod容器基础概念

一 Pod基础概念: ①Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个 Pod代表着集群中运行的一个进程。一个pod包含一个或多个容器。如:应用容器/业务容器(淘 宝、京东、拼多多后台&#xff…

水电自动抄表系统是什么?

1.简述:水电自动抄表系统 水电自动抄表系统是一种现代化计量检定解决方法,为提升公用事业服务项目的效率和精确性。传统式手动抄水表方法已经被这类高效率、精准的自动化系统所替代,它能够实时、远程控制地收集解决水电使用数据。 2.系统原…

国产性能怪兽——香橙派AI Pro(8T)上手体验报告以及性能评测

目录 1、引言2、性能参数3、开箱体验4、实际使用5、性能比较总结参考文章 1、引言 第一次接触香橙派的开发板,之前使用过Arduino、树莓派3B、树莓派4B,STM32,51单片机,没有想到国产品牌性能一样强劲,使用起来也是很方便…

Llama 3 模型家族构建安全可信赖企业级AI应用之使用 Llama Guard 保护大模型对话 (八)

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…

鸿蒙开发接口图形图像:【@ohos.screen (屏幕)】

屏幕 本模块提供管理屏幕的一些基础能力,包括获取屏幕对象,监听屏幕变化,创建和销毁虚拟屏幕等。 说明:开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。…

LBank研究院: DePIN赛道解析|加密精神与Jevons悖论的第三世界

作者:Eva,LBank研究员 *本人谨代表作者观点,不构成任何交易建议。 *本文内容为原创,版权为LBank所有,如需转载请注明作者和出处,否则将追究法律责任。 TLDR: DePIN是对传统老牌硬件的洗牌挑战&#xff…

节水“云”科普丨北京昌平VR节水云展馆精彩上线

2024年5月15日上午,由北京昌平区水务局主办的“推进城市节水,建设美丽昌平——2024年全国城市节约用水宣传周暨‘坚持节水优先 树立节水标杆’昌平节水在行动主题实践活动”隆重举办,活动期间,昌平区水务局应用VR虚拟现实技术创新…

你什么时候感觉学明白Java了?

学是学不明白Java的,要学明白Java,一定只能在工作以后。 1 在学习阶段,哪怕是借鉴别人的学习路线,其实依然会学很多不必要的技能,比如jsp,swing,或者多线程,或者设计模式。 2 或者…

vue2注册全局过滤器filters

全局过滤器 **在filters节点下定义的过滤器,称为私有过滤器**,因为它只能在当前vm实例所使用,**如果希望在多个vue实例之间共享过滤器**,可使用下面方法定义全局过滤器: Vue.filter( )方法接受两个参数: …

php 变量值传递和引用传递

一、值传递和引用传递 二、在foreach 中的引用传递 public function actionR(){$a [a>1,b>2,];foreach ($a as &$item){$i 100;$item $i;}$b [a>1,b>2];foreach ($b as &$item){$i 99;$item $i;}var_dump($a,$b);}可见 在两个foreach 中&$item …

md5强弱碰撞

一,类型。 1.弱比较 php中的""和""在进行比较时,数字和字符串比较或者涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。按照此理,我们可以上传md5编码后是0e的字符串,在…