【ES6复习笔记】Promise对象详解(12)

1. 什么是 Promise?

Promise 是 JavaScript 中处理异步操作的一种机制,它可以让异步操作更加容易管理和控制。Promise 对象代表一个异步操作的最终完成或失败,并提供了一种方式来处理操作的结果。

2. Promise 的基本语法

Promise 对象有三种状态:

  • Pending(进行中):初始状态,既不是成功,也不是失败。
  • Fulfilled(成功):操作成功完成。
  • Rejected(失败):操作失败。

改变Promise状态:Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。状态一旦改变,就不会再变,也就是说,Promise对象的状态改变是单向的。

Promise 的基本语法如下:

// 实例化promise对象
const promise = new Promise((resolve, reject) => {// 异步操作if (/* 异步操作成功 */) {resolve(value); // 将Promise对象的状态从“pending”变为“fulfilled”,同时将异步操作的结果,作为回调函数的参数} else {reject(reason); // 将Promise对象的状态从“pending”变为“rejected”,同时将异步操作报出的错误,作为回调函数的参数}
});promise.then(value => {// 成功时的回调函数,即当Promise的状态变为fulfilled时调用
}, reason => {// 失败时的回调函数,即当Promise的状态变为rejected时调用
});// 例如:
//实例化 Promise 对象
const p = new Promise(function(resolve, reject){setTimeout(function(){//// let data = '数据库中的用户数据';// resolve// resolve(data);let err = '数据读取失败';reject(err);}, 1000);
});//调用 promise 对象的 then 方法
p.then(function(value){console.log(value);
}, function(reason){console.error(reason);
})

3.Promise的then方法

const p =new Promise((resolve, reject) =>{setTimeout(()=>{resolve('用户数据');})
});//then()函数返回的实际也是一个Promise对象
//1.当回调后,返回的是非Promise类型的属性时,状态为fulfilled,then()函数的返回值为对象的成功值,如reutnr 123,返回的Promise对象值为123,如果没有返回值,是undefined//2.当回调后,返回的是Promise类型的对象时,then()函数的返回值为这个Promise对象的状态值//3.当回调后,如果抛出的异常,则then()函数的返回值状态也是rejected
let result = p.then(value => {console.log(value)// return 123;// return new Promise((resolve, reject) => {//     resolve('ok')// })throw 123
},reason => {console.log(reason)
})
console.log(result);

4. Promise的catch方法

catch()函数只有一个回调函数,意味着如果Promise对象状态为失败就会调用catch()方法并且调用回调函数

const p = new Promise((resolve, reject)=>{setTimeout(()=>{//设置 p 对象的状态为失败, 并设置失败的值reject("出错啦!");}, 1000)
});// p.then(function(value){}, function(reason){
//     console.error(reason);
// });p.catch(function(reason){console.warn(reason);
});

5. Promise 的实践

5.1 读取单个文件

使用 Promise 封装读取文件的操作:

// 引入 fs 模块
const fs = require('fs');// 使用 Promise 封装
const p = new Promise(function(resolve, reject){fs.readFile("./resources/为学.md", (err, data)=>{// 判断如果失败if(err) reject(err);// 如果成功resolve(data);});
});p.then(function(value){console.log(value.toString());
}, function(reason){console.log("读取失败!!");
});

5.2 读取多个文件

使用 Promise 链式调用读取多个文件:

// 引入 fs 模块
const fs = require("fs");// 使用 promise 实现
const p = new Promise((resolve, reject) => {fs.readFile("./resources/为学.md", (err, data) => {resolve(data);});
});p.then(value => {return new Promise((resolve, reject) => {fs.readFile("./resources/插秧诗.md", (err, data) => {resolve([value, data]);});});
}).then(value => {return new Promise((resolve, reject) => {fs.readFile("./resources/观书有感.md", (err, data) => {// 压入value.push(data);resolve(value);});})
}).then(value => {console.log(value.join('\r\n'));
});

6.promise封装Ajax

function ajax(url) {return new Promise((resolve, reject) => {const xhr = new XMLHttpRequest();xhr.open('GET', url);xhr.onreadystatechange = function() {if (xhr.readyState === 4) {if (xhr.status >= 200 && xhr.status < 300) {resolve(xhr.responseText);} else {reject(new Error(xhr.statusText));}}};xhr.send();});
}// 使用封装好的函数发送 AJAX 请求
ajax('https://api.example.com/data').then(data => {console.log(data);}).catch(error => {console.error(error);});

7. Promise.all()

Promise.all 方法用于将多个 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"]

8. 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" —— 因为它比 promise1 完成得快
});

9. 总结

Promise 是 JavaScript 中处理异步操作的一种强大机制,它可以让异步操作更加容易管理和控制。通过封装异步操作,可以避免回调地狱,使代码更加清晰和易于维护。

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

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

相关文章

【开源】一款基于SpringBoot的智慧小区物业管理系统

一、下载项目文件 项目文件源码链接&#xff1a;https://pan.quark.cn/s/3998d958e182如出现网盘空间不够存的情况&#xff01;&#xff01;&#xff01;解决办法是先用夸克手机app注册&#xff0c;然后保存上方链接&#xff0c;就可以得到1TB空间了&#xff01;&#xff01;&…

AMD | GPU | 深度学习 | 如何使用

问题&#xff1a;我在复现代码的时候&#xff0c;发现自己只拥有AMD的GPU&#xff0c;对于一个硬件小白来说&#xff0c;怎么办呢&#xff1f;我想看看怎么使用&#xff1b;解决&#xff1a; 首先要安装支持AMD的GPU的pytorch&#xff0c;pytorch&#xff1b; 使程序在安装了支…

【HarmonyOS】鸿蒙arrayBuffer和Uint8Array互相转化

【HarmonyOS】鸿蒙arrayBuffer和Uint8Array互相转化 前言 ArrayBuffer ArrayBuffer内部包含一块Native内存&#xff0c;该ArrayBuffer的JS对象壳被分配在虚拟机本地堆&#xff08;LocalHeap&#xff09;。与普通对象一样&#xff0c;需要经过序列化与反序列化拷贝传递&#x…

从 ELK Stack 到简单 — Elastic Cloud Serverless 上的 Elastic 可观察性

作者&#xff1a;来自 Elastic Bahubali Shetti, Chris DiStasio 宣布 Elastic Cloud Serverless 上的 Elastic Observability 正式发布 — 一款完全托管的可观察性解决方案。 随着组织规模的扩大&#xff0c;一个能够处理分布式云环境的复杂性并提供实时洞察的可观察性解决方…

MySQL数据库的索引

一、数据库的索引 1. 索引的概论 索引&#xff08;Index&#xff09;是书籍的重要组成部分&#xff0c;它列出了书中的重要名词及其对应的页码&#xff0c;方便读者快速查找这些名词的定义和含义。通过索引&#xff0c;用户无需通读整本书就能迅速找到所需的信息。 数据库索…

仓颉语言实战——1. 类型

仓颉语言实战——1. 类型 仓颉语言&#xff08;Cangjie Language&#xff09;是一个现代化的、简洁而强大的编程语言&#xff0c;它的类型系统为高效开发提供了极大的支持。本篇文章将围绕仓颉语言中的类型系统展开&#xff0c;结合实战代码&#xff0c;帮助开发者快速掌握这一…

【已解决】图片png转ico格式

起因&#xff1a; pyinstaller 打包时需要 ico 格式图片&#xff0c;但是通常手上只有png格式的图片&#xff0c;为了将png转为ico&#xff0c;直接改后缀会报错“struct.error: unpack requires a buffer of 16 bytes”&#xff0c;我就上网搜了一下&#xff0c;发现都是一些…

机器学习详解(11):分类任务的模型评估标准

模型评估是利用不同的评估指标来了解机器学习模型的性能&#xff0c;以及其优势和劣势的过程。评估对于确保机器学习模型的可靠性、泛化能力以及在新数据上的准确预测能力至关重要。 文章目录 1 介绍2 评估准则3 分类指标3.1 准确率 (Accuracy)3.2 精确率 (Precision)3.3 召回率…

Python-网络爬虫

随着网络的迅速发展&#xff0c;如何有效地提取并利用信息已经成为一个巨大的挑战。为了更高效地获取指定信息&#xff0c;需定向抓取并分析网页资源&#xff0c;从而促进了网络爬虫的发展。本章将介绍使用Python编写网络爬虫的方法。 学习目标&#xff1a; 理解网络爬虫的基本…

【超级详细】七牛云配置阿里云域名详细过程记录

0. 准备一个阿里云域名&#xff0c;记得要备案&#xff01;&#xff01;&#xff01;&#xff01; 1. 创建七牛云存储空间 首先&#xff0c;登录七牛云控制台&#xff0c;创建一个新的存储空间&#xff08;Bucket&#xff09;。这个存储空间将用于存放你的文件&#xff0c;并…

WPF使用资源定义和样式资源,解耦视图与逻辑(较多样式重复的时候使用)

-- 将Button的Style写到Window.Resources中 其中Window.Resource的Style也是可以继承的&#xff0c;需要使用BaseOn这个属性 还有很多用法的&#xff0c;有空再补充

GitLab安装及使用

目录 一、安装 1.创建一个目录用来放rpm包 2.检查防火墙状态 3.安装下载好的rpm包 4.修改配置文件 5.重新加载配置 6.查看版本 7.查看服务器状态 8.重启服务器 9.输网址 二、GitLab的使用 1.创建空白项目 2.配置ssh 首先生成公钥&#xff1a; 查看公钥 把上面的…

Socket学习(一):控制台聊天demo

实现效果 客户端连接服务端后&#xff0c;可在控制台输入要发送的消息&#xff0c;服务端收到消息后自动回复消息并将消息转发给所有连接上的客户端&#xff1a; 服务端收到消息并回复 客户端1发送消息并接收服务端的回复 客户端2接收服务端转发的消息 源码 SocketServer…

虚拟机桥接模式

主机Win10,虚拟机xp 1.虚拟机设置中选择桥接模式 2.在虚拟机菜单&#xff1a;编辑>虚拟机网络编辑&#xff0c;点击“更改设置”&#xff0c;可以看到三个网卡&#xff0c;这三个网卡分别对应不同的网络共享模式。桥接模式须使用VMnet0&#xff0c;如果没看到这个网卡&…

功能测试和接口测试

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之…

2022博客之星年度总评选开始了

作者简介&#xff1a;陶然同学 专注于Java领域开发 熟练掌握Java、js等语言的“Hello World” CSDN原力计划作者、CSDN内容合伙人、Java领域优质作者、Java领域新星作者、51CTO专家、华为云专家、阿里云专家等 &#x1f3ac; 陶然同学&#x1f3a5; 由 陶然同学 原创&#…

Spring自动化创建脚本-解放繁琐的初始化配置!!!(自动化SSM整合)

一、实现功能(原创&#xff0c;转载请告知) 1.自动配置pom配置文件 2.自动识别数据库及数据表&#xff0c;创建Entity、Dao、Service、Controller等 3.自动创建database.properties、mybatis-config.xml等数据库文件 4.自动创建spring-dao.xml spring-mvc.xml …

Linux总结之CentOS Stream 9安装mysql8.0实操安装成功记录

Linux总结之CentOS Stream 9安装mysql8.0实操安装成功记录 由于网上很多的mysql8.0安装教程都是老版本或者安装过程记录有问题&#xff0c;导致经常安装到一半需要删除重新安装。所以将成功的实操安装过程记录一下&#xff0c;方面后面查阅&#xff0c;大家还有问题的可以在此讨…

柒拾捌- 如何通过数据影响决策(六)- 放大再放大

1、整体带来的错觉 当我们观察宏观的数据时&#xff0c;常常会发现有些东西 无法理解。例如为什么人人都说楼价在跌&#xff0c;但公布的楼价数据却在涨&#xff1f;例如为什么经济感受那么差&#xff0c;宏观数据却还是在涨&#xff1f; 如果我们只在于 某个粒度 的数据&…

sql group by 多个字段例子

有表如下&#xff1b; 获取某年份、某地区、某产品的销售总额&#xff0c; 或者根据需要把字段顺序换一下&#xff1b; insert into sales (product, year, region, amount) values (飞机,2000,东部,5); insert into sales (product, year, region, amount) values (飞机,2001,…