网站首页 > 博客文章 正文
学习背景
实现nodejs的非阻塞IO就需要异步函数,之前我们讲了异步的几种实现方案。其中就说到了Promise的方案,这章呢我们详细的讲一讲Promise方案的详细用法,以及为什么nodejs要提供一个Promise。
Promise 用法
之前我们遇到了callback方法过多的话会形成回调地狱问题,这时我们的代码就形成了一层一层的回调嵌套,就像洋葱一样。这时候变量作用域也不清晰了,执行时序问题也越来越乱,出现问题修改起来很痛苦,比如
看起来是不是绝望了。官方也发现了这个问题,所以引入了Promise。
Promise就是把异步函数转变成一个对象,这个对象有自己的属性以及方法。这个对象有着自己的状态生命周期,也有自己的功能方法。
Promise字面理解是约定的意思,这个约定可以被实现也可以被拒绝。举个简单的例子吧,朋友约我今晚去打撸啊撸,我今天下班就陪他去了,履行了约定。还有一种可能性是公司临时让我加班,我没时间去了,我只能失约了。
创建Promise
按照上面那个栗子,创建一个Promise代码如下
// 第一步,我们创建一个去玩lol的约定
console.log('你下班陪我去打lol')
const playLolPromise = new Promise(
function (resolve, reject) {
let workOvertime = true // 是否加班
setTimeout(() => {
console.log('到下班时间了')
if (workOvertime) { // 加班了
reject(new Error('我加班了')) // 数据处理出错
} else { // 没有加班
resolve(true) // 数据处理完成
}
}, 100)
}
)
playLolPromise.then((res) => {
console.log('我没加班,我准时来了')
console.log('我成功守约')
}).catch((e) => {
console.log('我没有守约,因为:' + e.message)
}).finally(() => {
console.log('不管有没有守约,我都要通知你')
})
没加班运行结果
你下班陪我去打lol
到下班时间了
我没加班,我准时来了
我成功守约
不管有没有守约,我都要通知你
加班运行结果
你下班陪我去打lol
到下班时间了
我没有守约,因为:我加班了
不管有没有守约,我都要通知你
可以看出Promise通过new 关键字创建,创建的时候有两个参数reject和resolve,它两是一个方法,当需要成功守约的时候把结果传给resolve,如果要失约的话把原因传给reject。
Promise的三个状态
Promise有三个状态:
- 1、pending[约定好]初始状态,代表约定任务还没执行
- 2、resolved[守约]代表守约了
- 3、rejected[违约]代表违约了
promise状态只会变化一次,要么是从pending到resolved成功守约状态,要么是pending到rejected失约状态
resolve 守约
它的作用是将Promise对象的状态从“约定”变为“守约”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出并触发约定的then和finally方法.
reject 违约
作用是,将Promise对象的状态从“约定”变为“失约”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为失败原因传递出去并触发约定的catch和finally方法。
Promise 的常用方法
Promise.resolve 现有对象转为Promise对象并完成守约
const promise = Promise.resolve('我没加班')
// 等价于
// const promise = new Promise(resolve => resolve('我没加班'))
promise.then((res)=>{
console.log('我守约了:'+res) // 打印“我守约了:我没加班”
})
Promise.reject 现有对象转为Promise对象并失约,并设置失约原因
const promise = Promise.reject('我加班了')
// 等价于
// const promise = new Promise((resolve,reject) => reject('我加班了'))
promise.catch((reason)=>{
console.log('我失约了:'+reason) // 打印“我失约了:我加班了”
})
Promise.all([p1,p2,p3...]) 将多个Promise实例包装成一个新的Promise实例,并将结果合并为同序数组
成功和失败的返回值是不同,成功的时候返回的是一个结果数组,这个结果数组的顺序和传入的promise顺序一致,而失败的时候则只会返回最先被reject失败状态的值。
Promise.race([p1,p2,p3....])将多个Promise实例包装成一个新的Promise实例,返回最快的结果,不过这个不常用
callback转成Promise
把fs.unlink转成Promise
let unlinkPromise = function(filePath) {
return new Promise(function(resolve, reject) {
fs.unlink(filePath, (err) => {
if(err) return reject(err);
return resolve();
})
})
}
// 等价于
const util = require('util')
let unlinkPromise = util.promisify(fs.unlink);
最后
这一章我们我们需要重点掌握Promise的概念以及如何创建Promise,nodejs官方大力推荐Promise的解决方案,并提供了async 和await的语法糖来实现以同步的方式写异步方法.来让我们js代码看起来更舒服更容易维护.下一章我将教大家async 和await是如何与Promise搭配使用的.
猜你喜欢
- 2024-09-27 搞懂ES6语法之promise-那些常用姿势
- 2024-09-27 抢先熟悉ES2021新特性(es2021 新特性)
- 2024-09-27 JavaScript: Promises 介绍及为何 Async/Await 最终取得胜利
- 2024-09-27 种草 ES2020 八大新功能(es2020特性)
- 2024-09-27 碎片时间学编程「21]:异步 JavaScript 备忘总结
- 2024-09-27 async异步操作函数(async await异步请求)
- 2024-09-27 【JavaScript】ES6之Promise用法详解及其应用
- 2024-09-27 JavaScript,ES11,Promise.allSettled,返回一个Promise对象
- 2024-09-27 JavaScript中的Promise:异步编程的利器
- 2024-09-27 [那些被问烂的前端面试题]-手写Promise有什么含金量与考点?
你 发表评论:
欢迎- 最近发表
-
- 给3D Slicer添加Python第三方插件库
- Python自动化——pytest常用插件详解
- Pycharm下安装MicroPython Tools插件(ESP32开发板)
- IntelliJ IDEA 2025.1.3 发布(idea 2020)
- IDEA+Continue插件+DeepSeek:开发者效率飙升的「三体组合」!
- Cursor:提升Python开发效率的必备IDE及插件安装指南
- 日本旅行时想借厕所、买香烟怎么办?便利商店里能解决大问题!
- 11天!日本史上最长黄金周来了!旅游万金句总结!
- 北川景子&DAIGO缘定1.11 召开记者会宣布结婚
- PIKO‘PPAP’ 洗脑歌登上美国告示牌
- 标签列表
-
- ifneq (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)