当前位置: 首页 > news >正文

前端基础知识---Promise

1 promimse的介绍

promise 是异步编程的新解决方案

异步编程:

fs 文件操作

ajax数据库

定时器

回调函数与promise的区别:

(1)promise支持链式调用,可以解决回调地狱问题

(2)更灵活

2 随机中奖案例

<body><div class="container"><h2 class="page-header">Promise初体验</h2><button class="btn btn-primary" id="btn">点击抽奖</button></div><script>//生成随机数function rand(m,n){return Math.ceil(Math.random()*(n-m+1))+m-1}// 获取元素对象
const btn = document.querySelector('#btn');
// 绑定单击事件
btn.addEventListener('click', function() {// promise实现异步操作(局部变量p)const p = new Promise((res, rej) => {setTimeout(() => {let n = rand(1, 100);if (n <= 30) res(n);else rej(n);}, 1000);});// 在这里调用then,确保能访问到pp.then((value) => alert('恭喜中奖,'+'你的中奖号码是'+value),(reason) => alert('再接再厉,'+'你的号码是'+reason));
});

3 读取文件案例

注意:读出来的是buffer格式,所以需要toString转成字符串格式


const fs = require('fs')
let p = new Promise((res,rej)=>{fs.readFile('./resource/text.txt',(err,data)=>{if(err) rej(err)res(data)})
})//调用then
p.then(value=>{console.log(value.toString())
},reason=>{console.log(reason)})

4 promise 封装和风格化( 风格化减少了封装步骤)

封装:

//封装一个函数读取文件内容
function mineReadFile(path){return new Promise((res,rej)=>{//读取文件require('fs').readFile(path,(err,data)=>{if(err) rej(err)res(data)})})
}mineReadFile('./resource/text.txt')
.then(value=>{//输出文件内容console.log(value.toString());
},reason=>{console.log(reason)
}
)

风格化:

const util = require('util')
const fs = require('fs')
let mineReadFile = util.promisify(fs.readFile)
mineReadFile('./resource/text.txt').then(value=>{console.log(value.toString())
})

5 promise对象属性   

状态属性    PromiseState   

pending        未决定的

resolved        /        fullfilled        成功

rejected        失败

状态只会从pending转到其他两种属性

值属性 PromiseState

resolve

reject

无论成功与失败,这两个值都被保存

工作流程:

6 promise的关键问题

Promise 的 .then() 回调有个核心特性:它会 “等待” 前一个 Promise 完成后才执行

7 自定义封装

7.1 resolve和reject

Promise.resolve(value) 的核心逻辑是任意值(包括 Promise 实例)转换为一个 Promise 对象,并根据 value 的类型决定最终状态

Promise.reject(reason) 的逻辑很简单:不管 reason 是什么(不管是不是 Promise),直接返回一个 “失败状态” 的 Promise

//添加resolve方法
Promise.resolve = function(value){//返回promise对象return new Promise((res,rej)=>{if(value instanceof Promise){value.then(v=>{res(v)},r=>{rej(r)})}else{//状态设置成功res(value)}})
}//添加reject方法
Promise.reject = function(reason){return new Promise((res,rej)=>{rej(reason)})
}

7.2 all方法

//添加all方法
Promise.all = function(promises){//返回结果是promise对象return new Promise((res,rej)=>{//声明变量let count = 0let arr = []for(let i=0; i<promises.length;i++){promises[i].then(v=>{count++;    //promise对象状态是成功则count+1arr[i]=v    //将当前promise对象成功的结果存入到数组中if(count === promises.length){//修改状态res(arr)}},r=>{rej(r)})}})
}

7.3 race方法

//添加race方法
Promise.race =function(promises){return new Promise((res,rej)=>{for(let i=0;i<promises.length;i++){promises[0].then(v=>{//修改返回对象的状态为成功res(v)},r=>{rej(r)})}})
}

7.4 then方法的异步回调执行(添加计时器)

 //调用成功的回调函数setTimeout(()=>{self.callback.forEach(item=>{item.onResolved(data)})})// 3. 执行失败回调(遍历callback数组,调用onRejected)setTimeout(()=>{self.callback.forEach(item => {item.onRejected(data);});})

7.5 封装

resolve不是实例对象,属于类(构造函数用static)

8 Async与await

8.1 async函数

(1)函数返回值为promise对象

(2)promise返回对象的结果由async函数执行的返回值决定(类似then方法)

8.2 await表达式

await 只能跟 Promise 对象 配合使用。

(1)await右侧的表达式一般为promise对象,但也可以是其他的值

(2)如果表达式是promise对象,await返回的是promise成功的值

(3)如果表达式是其他值,直接将此值作为await的返回值

8.3 async和await的结合

const fs = require('fs').promises;// 正确实现异步读取函数
async function mineReadFile(path) {return await fs.readFile(path, 'utf8'); // 指定编码为 utf8
}async function main(){try{//读取第一个文件的内容let data1 = await mineReadFile('./resource/1.txt')let data2 = await mineReadFile('./resource/2.txt')let data3 = await mineReadFile('./resource/3.txt')console.log(data1 + data2 + data3)}catch(e){}}
main()

http://www.dtcms.com/a/557490.html

相关文章:

  • Java 基础——函数式编程
  • webkitx(Android WebView 最佳实践库)
  • 调查网站做调查不容易过横栏建设网站
  • 勐海县住房和城乡建设局网站南昌做网站费用
  • 感知上下文并可解释地预测合成致死药物靶点的大语言模型研究
  • AI研究-117 特斯拉 FSD 视觉解析:多摄像头 - 3D占用网络 - 车机渲染,盲区与低速复杂路况安全指南
  • 二级域名可以做网站吗免费个人博客网站模板下载
  • 复原大唐3d项目测试版
  • 2024年MySQL 下载、安装及启动停止教程(非常
  • 兰州百度网站建设百度网站关键词优化在哪里做
  • Redis——Windows安装
  • 微信网站开发视频教程免费的黄金软件
  • 【高级机器学习】0. Machine Learning 介绍
  • 昆明城乡和住房建设局网站网站做5级分销合法吗
  • .NETCore、.NET 7 和 RabbitMQ 的发布-订阅模式
  • Crashpad 在windows下编译和使用指南
  • 基于SpringBoot+Vue的农产品销售系统【协同过滤推荐算法+可视化统计】
  • 基于flet的一款windows桌面应用,实现了浏览图片、音乐、小说、各种资源的功能
  • 【开题答辩过程】以《基于微信小程序的线上讲座管理系统》为例,不会开题答辩的可以进来看看
  • 怎么做好网站建设新手怎么开传媒公司
  • 2025年8月AGI月评|AI开源项目全解析:从智能体到3D世界,技术边界再突破
  • CSP-J/S 2025 游记
  • 深入洞察:业务流程从概念到实践
  • realloc用法
  • 智慧团建网站登录电脑版装饰工程有限公司的经营范围
  • STM32学习(MCU控制)(SPI and Flash 存储)
  • 网站推广有哪些方案pr免费模板网站
  • 轻量级HTTPSocks代理GOST: Linux编译安装
  • 有没有教做健身餐的网站wordpress菜单跳转
  • 以小白视角尝试 WPF / WinUI3 / MAUI / MAUI Blazor 构建 Windows 桌面程序