网站首页 > 博客文章 正文
引言
最开始我们使用JavaScript的时候就有回调的概念,它并没有什么特别的地方,由于JavaScript的异步性质,许许多多地方都需要用到回调,并不能立即获取我们想要的结果,如下使用Node.js读取文件:
当我们想要进行多个异步操作就会出现问题。想象以下这样的一些场景(所有的操作都是异步的)
- 我们再查询出用户的信息后,需要根据用户的信息到某个服务器去请求用户的图片
- 查出图片后,我们需要将图片转换格式,比如从PNG转换成JPEG
- 如果转换成功,我们发送成功的邮件通知
- 发送之后我们在记录下这个时间点的日志
那么代码看起来可能像下面这样:
这样的代码让我不禁想起来了无数的if阶梯嵌套,一不小心就陷入回调地狱,这样的缺点很明显:
- 代码变得更难阅读
- 错误处理起来相对复杂,就更容易导致代码的错误
Promise
为了避免回调地狱,Javascript众神创造了promise,我们就可以链式编程了,而不是内嵌套回调,那么改一下代码如下:
虽然以上代码已经是一种从上到下的流程,但仍然存在一些问题
- 需要.then
- 需要.catch处理异常,而不是try/catch的方式
- 多个promise
异步功能
在ES2017(ES8)中引入了异步功能,这让我们更简单的来使用promise,异步编程的好处最直观的就是:
- 使用async/await避免链式的promise
- 它们是异步的执行,不过给了你同步编程的感觉
因此,在我们理解async/await之前,你需要对promise有一定的了解
语法
注意async放的位置,特别是箭头函数,异步的声明也可以用在对象方法和类方法上
- 备注:构造函数不能用
与普通函数的区别就是异步函数返回的是一个promise对象,如下
它和下面的等效,这里我们是手动创建一个promise,而不是使用async
换句话说,异步函数的返回值总是包含在Promise.resolve中
异步函数await
先看一段代码,在分析:
- fn执行时,评估 const a = await 9,实际上内部转换成了const a await Promise.resolve(9);
- 我们使用了await,fn暂停到a获取值
- delayAndGetRandom(1000)导致fn暂停一秒后获取到随机值
错误处理
通过以上示例大致的知道,如何使用async和await了,但是我们并没有看到异常处理的部分,所以接下来就看一下
canRejectOrReturn()是一个异步函数,它的最终结果为 'perfect number'或拒绝 Error('Sorry, number too big'),我们来写一下捕获这段异常的代码
对比另一个示例
少了await关键字,catch永远都不会执行,这是常见的错误或陷阱,就是没有使用await
并行化
有些时候我们可能需要并行的执行一些操作,那么我们继续要使用Promise.All了,示例如下:
Promise.all接收一个promises数组作为输入并返回一个promise作为输出
总结
异步功能在开发中变得越来越重要了,也将被越来越多的开发人员所采用,所以对我们来说,了解异步就显得非常重要了,希望这边文章能够帮助大家了解JS中的异步编程,如果可以,请麻烦点个关注吧,谢谢!
猜你喜欢
- 2024-10-11 JavaScript,ES6,Promise对象,异步编程的一种解决方案,代码
- 2024-10-11 使用 Matter.js 创建物理模拟:牛顿摆
- 2024-10-11 一首歌带你搞懂Promise(歌曲promise)
- 2024-10-11 如何用Vue3和p5.js绘制一个交互式波浪图
- 2024-10-11 IT技术栈:Javascript中Promise的pending、fulfilled和rejected
- 2024-10-11 Node.js中的Promise:回调的替代方案
- 2024-10-11 我终于真正理解 Promise 了!(promise 的理解)
- 2024-10-11 探究JS中Promise函数then的奥秘(js中promise什么意思)
- 2024-10-11 关于js中的promise,与其说是一种语法还不如说是一种思想!
- 2024-10-11 前端-JavaScript异步编程中的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)
本文暂时没有评论,来添加一个吧(●'◡'●)