JS Promise使用注意事项

news/2024/4/26 21:19:16/文章来源:https://blog.csdn.net/iamlujingtao/article/details/129177624

JS Promise使用注意事项

  • 前言
  • 一、finally使用
  • 二、错误捕获
    • 2.1 .cath捕获
    • 2.2 try catch捕获
  • 三、Promise方法内使用return
    • 3.1 前置return
    • 3.2 后置return
  • 四 no-async-promise-executor
  • 五、no-await-in-loop

前言

对于js而言,我们平时使用promise情况是十分常见的 ,然而有些地方并没有很好地使用,这篇文章介绍常见的promise不规范示范和正确使用方式。

一、finally使用

通常开发过程中,我们页面都有loading,使用Promise前开启loading,结束的时候关闭loading。但有些小伙伴会在then和catch里面结束,这样不够优雅,其实最好是在finally里面结束。
正确示范:

  let isLoading = trueconst result = await promiseSuccess().finally(() => {isLoading = false})

二、错误捕获

错误捕获可以使用.catch 和try catch,二者是由区别的,最大区别是try catch只要捕获到一个错误就会中断后续代码,但.catch不会,需要结合resolve结果来中断代码。

现在我们拥有2个方法

  • promiseSuccess(),该方法100%返回resolve(true)
  • promiseFail(),该方法100%返回reject(new Error("出错了"))
/** promise成功 */
function promiseSuccess() {return new Promise((resolve) => {resolve(true)})
}/** promise失败 */
function promiseFail(errorStr = '出错了') {return new Promise((resolve, reject) => {reject(new Error(errorStr))})
}

2.1 .cath捕获

  console.log(1)await promiseSuccess().catch((error) => {console.log(error)})console.log(2)await promiseFail().catch((error) => {console.log(error)})console.log(3)
  • 执行上述代码,结果是
1
2
Error: 出错了
3

通常我们是发生错误的时候需要中断代码执行,那么需要结合resolve结果来判断是否要中断代码,正确写法是

  console.log(1)const result1 = await promiseSuccess().catch((error) => {console.log(error)})if (!result1) returnconsole.log(2)const result2 = await promiseFail().catch((error) => {console.log(error)})if (!result2) returnconsole.log(3)
  • 执行上述代码,结果是
1
2
Error: 出错了

2.2 try catch捕获

上述代码好像有点啰嗦,所以我们可以用try catch,正确代码:

  try {console.log(1)const result1 = await promiseSuccess()console.log(2)const result2 = await promiseFail()console.log(3)} catch (error) {console.log(error)}
  • 执行上述代码,结果是
1
2
Error: 出错了

三、Promise方法内使用return

首先,Promise方法内使用return是不建议的,如果有用eslint,那么会提示 no-return-await,我们看看如果用return会由什么结果

3.1 前置return

  • 修改方法promiseSuccess,会在resolve前执行return
/** promise成功 */
function promiseSuccess() {return new Promise((resolve) => {return 'return'resolve(true)})
}
  • 测试程序
console.log(1)const result = await promiseSuccess().catch((error) => {console.log(error)
})
console.log('result', result)
if (!result) returnconsole.log(2)
  • 执行上述代码,结果是
1
  • 原因分析:由于promiseSuccess没有执行到resolve,所以await一直在等待,程序不会往下处理。

3.2 后置return

  • 修改方法promiseSuccess,会在resolve后执行return
/** promise成功 */
function promiseSuccess() {return new Promise((resolve) => {resolve(true)return 'return'})
}
  • 测试程序设上面一致
  • 执行上述代码,结果是
1
result true
2
  • 原因分析:await只会获取resolve结果,里面的return值并没有影响

四 no-async-promise-executor

不建议将 async 函数传递给 new Promise 的构造函数;
如果下面代码,如果有用eslint会提示 no-async-promise-executor,原因是async本来是异步的,就无必要嵌套在Promise里面了。

  • 代码示范
// 错误示范:
function promiseTest() {return new Promise(async (resolve) => {const result = await promiseSuccess()resolve(result)})
}// 正确示范1:
async function promiseTest() {const result = await promiseSuccess()return result
}// 正确示范2,如果硬要使用Promise,那么可以这样:
async function promiseTest() {const result = await promiseSuccess()return new Promise((resolve) => {resolve(result)})
}
  • 使用方式都一样
const result1 = await promiseTest().catch((error) => {console.log(error)
})
console.log('result1', result1)

五、no-await-in-loop

不建议在循环里使用 await,有这种写法通常意味着程序没有充分利用 JavaScript 的事件驱动。
通常情况下可以使用Promise.all 代替。

  • 示范代码:
// 错误示范:
async function foo(things) {const results = [];for (const thing of things) {results.push(await bar(thing));}return baz(results);
}// 正确示范:
async function foo(things) {const results = [];for (const thing of things) {results.push(bar(thing));}return baz(await Promise.all(results));
}

但是,如果每一次循环都需要改变数据,并且这个数据会带入到下次循环里,这种情况是可以使用循环里嵌套await的!

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

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

相关文章

C++进阶--二叉树编程题

文章目录力扣606. 根据二叉树创建字符串力扣102. 二叉树的层序遍历力扣236. 二叉树的最近公共祖先JZ36 二叉搜索树与双向链表力扣105--通过前序和中序遍历构造二叉树力扣144--二叉树的前序遍历(非递归)力扣94--二叉树的中序遍历(非递归&#…

虹科新闻|虹科与iX systems正式建立合作伙伴关系

近日,虹科与美国iXsystems公司达成战略合作,虹科正式成为iXsystems公司在中国区域的认证授权代理商。未来,虹科将携手iXsystems,共同致力于提供企业级存储解决方案。虹科及iXsystems双方的高层领导人员都对彼此的合作有很大的信心…

操作系统基础教程

目录 第二章:处理器管理 概览 进程调度的层次 进程的调度方式: 调度的评价标准: 典型的调度算法: 第三章:同步、通信和死锁 什么是进程同步? 什么是进程互斥? 进程同步的实现方式 进程…

JVM总结

1. 内存结构 线程私有区 程序计算器 作用:是一块较小的内存空间,存储的是当前线程所执行的字节码文件的序号特点:线程私有,不会出现内存空间溢出 虚拟机栈 虚拟机栈是管理JAVA方法执行的内存模型,每个方法执行时都…

贴吧顶贴软件《今日/更新》

贴吧顶贴软件《今日/更新》百收贴吧工具箱,贴吧顶帖软件,贴吧推广引流神器#贴吧顶帖#贴吧推广 hello,大家好,我是软件的作者百收编辑狂潮老师。本次的视频讲解是作为一个百度顶贴的自动化脚本的视频安装教程和使用教程。你作为新…

SpringCloud(五)MQ消息队列

MQ概念常见消息模型helloworld案例实现实现spring AMQP发送消息实现spring AMQP接收消息工作消息队列实现发布订阅模型Fanout Exchange实现DirectExchange实现TopicExchange实现DirectExchange 和FanoutExchange的差异DirectExchange 和TopicExchange的差异基于RabbitListener注…

钉钉产品体验报告

一、调研的目的了解企业社交软件,借写竞品分析来帮助自己整理思路,看清市场的发展趋势;体验这类企业设计软件,掌握产品核心业务流程和产品结构,把握需求对应的功能点和界面结构,并侧面了解用户习惯&#xf…

用Python做数据分析有哪些优势?

众所周知,可以用作数据分析的语言有很多,包含Python、R语言等,而且Python被誉为数据分析的一大利器,更是该领域的首选语言,那么用Python做数据分析有哪些优势呢?跟着蛋糕往下看。 第一、Python语言自身的优势 Pytho…

ShardingSphere水平、垂直分库、分表和公共表

目录一、ShardingSphere简介二、ShardingSphere-分库分表1、垂直拆分(1)垂直分库(2)垂直分表2、水平拆分(1)水平分库(2)水平分表三、水平分库操作1、创建数据库和表2、配置分片的规则…

BigGAN

1、BIGGAN 解读1.1、作者 Andrew Brock、Jeff Donahue、Karen Simonyan 1.2、摘要 尽管最近在生成图像建模方面取得了进展,但从 ImageNet 等复杂数据集中 成功生成高分辨率、多样化的样本仍然是一个难以实现的目标。为此,我们以迄 今为止最大的规模训练生…

fastadmin:在新增页面,打开弹窗单选,参数回传

样式:核心代码:一、弹窗的控制器中:// 定义一个公共函数select(),如果这个请求是Ajax,则返回index()函数,否则返回view对象的fetch()函数。 public function select() {if ($this->request->isAjax(…

【软件测试】测试老鸟的迷途,进军高级自动化测试测试......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 很多从业几年的选手…

【阿旭机器学习实战】【37】电影推荐系统---基于矩阵分解

【阿旭机器学习实战】系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流。 电影推荐系统 目录电影推荐系统1. 问题介绍1.1推荐系统矩阵分解方法介绍1.2 数据集:ml-100k2. 推荐系统实现2.1 定义矩阵分解函数2.2 …

消息中间件的概念

中间件(middleware)是基础软件的一大类,属于可复用的软件范畴。中间件在操作系统软件,网络和数据库之上,应用软件之下,总的作用是为处于自己上层的应用软件提供运行于开发的环境,帮助用户灵活、高效的开发和集成复杂的…

ICA简介:独立成分分析

1. 简介 您是否曾经遇到过这样一种情况:您试图分析一个复杂且高度相关的数据集,却对信息量感到不知所措?这就是独立成分分析 (ICA) 的用武之地。ICA 是数据分析领域的一项强大技术,可让您分离和识别多元数据集中的底层独立来源。 …

PPP简介,PPP分层体系架构,PPP链路建立过程及PPP的帧格式

PPP(Point-to-Point Protocol)是一种用于在两个网络节点之间传输数据的通信协议。它最初是为在拨号网络上进行拨号连接而开发的,现在已经被广泛应用于各种网络环境中,例如在宽带接入、虚拟专用网(VPN)等场景…

【JAVA】一个项目如何预先加载数据?

这里写目录标题需求实现AutowiredPostConstruct实例CommandLineRunner实例ApplicationListener实例参考需求 一般我们可能会有一些在应用启动时加载资源的需求,局部或者全局使用,让我们来看看都有哪些方式实现。 实现 Autowired 如果是某个类里需求某…

[1]MyBatis+Spring+SpringMVC+SSM整合

一、MyBatis 1、MyBatis简介 1.1、MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下, iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。…

Vue中如何利用websocket实现实时通讯

首先我们可以先做一个简单的例子来学习一下简单的websocket模拟聊天对话的功能 原理很简单,有点像VUE中的EventBus,用emit和on传来传去 首先我们可以先去自己去用node搭建一个本地服务器 步骤如下 1.新建一个app.js,然后创建pagejson.js文…

【Linux】-- POSIX信号量

目录 POSIX信号量 sem_init - 初始化信号量 sem_destroy - 销毁信号量 sem_wait - 等待信号量(P操作) 基于环形队列的生产消费模型 数据结构 - 环形结构 实现原理 POSIX信号量 #问:什么是信号量? 1. 共享资源 -> 任何一…