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

devtools/2024/12/28 18:32:08/

1. 什么是 Promise?

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

2. Promise 的基本语法

Promise 对象有三种状态:

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

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

Promise 的基本语法如下:

javascript">// 实例化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方法

javascript">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()方法并且调用回调函数

javascript">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 封装读取文件的操作:

javascript">// 引入 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 链式调用读取多个文件:

javascript">// 引入 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'));
});

promiseAjax_164">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 实例。

javascript">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 实例的结果值,作为返回结果。

javascript">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.ppmy.cn/devtools/145327.html

相关文章

国际网络专线怎么申请开通?

随着国内企业在国际市场中的活跃度逐年提升&#xff0c;国际网络专线逐渐成为保障企业高效运营的重要基础设施。稳定且高效的网络不仅能够提升工作效率&#xff0c;还能为海外业务的顺利开展提供可靠保障。那么&#xff0c;国际网络专线如何开通&#xff1f;其申请流程是怎样的…

Spring Boot 3.4新特性:RestClient和RestTemplate的重大更新详解

本文将深入探讨Spring Boot 3.4版本中关于RestClient和RestTemplate的重要更新。。 1. 背景介绍 在Spring生态系统中&#xff0c;HTTP客户端一直是一个重要的组件。从最早的RestTemplate&#xff0c;到WebClient&#xff0c;再到现在的RestClient&#xff0c;每一次演进都带来…

渗透测试学习路线

渗透测试学习之前基础&#xff1a; 计算机网络、操作系统&#xff08;对Windows、Linux操作系统熟悉&#xff0c;对常用命令了解&#xff09;、数据库、编程语言、web应用开发&#xff08;前端后端&#xff09; ⼊门级别的《Web安全渗透剖析》 进阶级别的《⽩帽⼦讲web安全》…

Elasticsearch:确保业务规则与语义搜索无缝协作

作者&#xff1a;来自 Elastic Kathleen DeRusso 利用查询规则与语义搜索和重新排序相结合的强大功能。 更多阅读&#xff1a; Elasticsearch 8.10 中引入查询规则 - query rules Elasticsearch 查询规则现已正式发布 - query rules 你是否知道查询规则&#xff08;query ru…

Reactor

文章目录 正确的理解发送double free问题 1.把我们的reactor进行拆分2.链接管理3.Reactor的理论 listensock只需要设置_recv_cb&#xff0c;而其他sock&#xff0c;读&#xff0c;写&#xff0c;异常 所以今天写nullptr其实就不太对&#xff0c;添加为空就没办法去响应事件 获…

连续自成核退火热分级(SSA)技术表征共聚聚丙烯(PP)分子链结构

共聚聚丙烯是一种多相多组分高分子体系&#xff0c;体系中同时存在多种链组成、序列结构和相结构。研究表明&#xff0c;共聚聚丙烯中除了均聚聚丙烯外&#xff0c;还有乙丙无规共聚物&#xff08;又称乙丙橡胶&#xff0c;EPR&#xff09;及不同序列长度的乙丙嵌段共聚物&…

React和Three.js结合-React Three Fiber

简介 React Three Fiber&#xff08;简称 R3F&#xff09;是一个用于在 React 中渲染 3D 图形的库&#xff0c;它将 Three.js 与 React 的声明式编程模型结合起来。Three.js 是一个广泛使用的 JavaScript 库&#xff0c;用于在 Web 中创建 3D 场景、动画和互动效果&#xff0c…

React 第十九节 useLayoutEffect 用途使用技巧注意事项详解

1、概述 useLayoutEffect 是useEffect 的一个衍生版本&#xff0c;只是他们的执行时机不同 useLayoutEffect 用于在DOM更新执行完成之后&#xff0c;浏览器渲染绘制之前执行&#xff0c;这会阻塞浏览器的渲染&#xff1b; useEffect 的执行时机是在组件首次渲染和更新渲染之后…