0

0

Promiseall( ) 困境:什么时候有帮助,什么时候有害

花韻仙語

花韻仙語

发布时间:2024-09-21 16:33:01

|

623人浏览过

|

来源于dev.to

转载

promiseall( ) 困境:什么时候有帮助,什么时候有害

在现代 javascript 开发中,处理异步操作是一项常见任务。无论是发出 api 请求、查询数据库还是读取文件,使用异步代码几乎是不可避免的。开发人员遇到的常见工具之一是 promise.all()。然而,我们中的许多人,包括我自己,可能会陷入尝试使用 promise.all() 的陷阱,只是因为它在那里,而没有真正理解它是否是我们特定用例的最佳解决方案。

1. 跟随 promise.all() 潮流

作为开发人员,很容易遇到新功能或工具,并认为它们应该在任何地方实现。我发现自己在 promise.all() 中处于这种情况。在阅读了它如何并行运行多个 promise 并等待所有 promise 完成后再继续后,我渴望将其集成到我的代码中。在没有完全理解是否有必要的情况下,我就跟风并尽可能地应用它。

很容易认为,既然它是一个强大的工具,它一定比更简单的替代品更好。但我很快意识到,盲目应用 promise.all() 而不考虑上下文并不总是能带来最高效或可读的代码。

2. 异步 javascript 基础知识

在我们深入探讨 promise.all() 何时有用之前,让我们首先看看异步函数在 javascript 中是如何工作的。当您编写异步函数并使用等待时,javascript 允许该操作发生,而不会阻塞其余代码。这意味着您可以启动一项操作,然后在等待结果的同时继续执行其他操作。

但是,如果您不小心,当操作可以独立运行时,您最终可能会导致操作不必要地相互依赖。我发现自己处于 promise.all() 的这种情况,认为并行运行所有异步函数总是一个好主意。

示例:异步函数的顺序执行

const fetchdata = async () => {
  const data1 = await getchart();   // request #1
  const data2 = await getdetails(); // request #2
};

即使在代码中 data1 和 data2 被依次获取,浏览器仍然异步且几乎同时发起这两个请求。事实上,当我检查“网络”选项卡时,我看到两个请求大约在同一时间开始。这让我意识到 javascript 已经可以并行处理事情了,而 promise.all() 并不是必需的。

3.什么时候应该使用promise.all()?

尽管我最初急于在任何地方使用 promise.all(),但在某些情况下它确实会大放异彩。当您需要等待多个异步操作完成才能继续操作时,它特别有用。

为什么使用 promise.all()?

  1. 等待所有 promise:如果多个异步任务的结果相互依赖,或者需要所有异步任务完成才能继续,promise.all() 是理想的选择。
  2. 错误处理:promise.all() 快速失败——这意味着如果任何 promise 失败,整个操作都会被拒绝。当您想要确保一切都成功或者没有任何进展时,这会很有用。
  3. 组合结果:如果您需要一次获得所有 promise 的结果(例如,将用户数据与购买历史记录相结合),promise.all() 是完美的解决方案。

示例:使用 promise.all()

const fetchdata = async () => {
  const [data1, data2] = await promise.all([getchart(), getdetails()]);
  console.log('both requests completed'); // this runs only when both requests finish
};

在此示例中,getchart() 和 getdetails() 并行运行,并且该函数会等到两者都完成后再继续。 promise.all() 在这种两个请求相关且需要一起完成的情况下非常完美。

4. 为什么我不需要 promise.all()

应用 promise.all() 几次后,我开始注意到它并不总是能让我的代码变得更好。事实上,我把事情过于复杂化了。我有两个独立的 api 请求 — getchart() 和 getdetails() — 每个请求都有自己的加载微调器和结果,但我不必要地将它们捆绑在一起。

通过使用 promise.all(),我强制代码在处理任一结果之前等待两个请求完成,即使这些请求是独立的并且不相互依赖。在这种情况下,promise.all() 只会增加复杂性,而没有任何实际好处。

5. 当 promise.all() 可能有点大材小用时

有时,promise.all() 有点矫枉过正。如果您的异步函数是独立的,这意味着一个函数不依赖另一个函数来完成,则无需将它们捆绑在一起。它们可以很好地并行运行,而无需相互等待,并且您可以独立处理它们的结果。当我看到 javascript 已经可以高效地处理异步任务而无需将所有内容组合在一起时,我意识到了这一点。

听脑AI
听脑AI

听脑AI语音,一款专注于音视频内容的工作学习助手,为用户提供便捷的音视频内容记录、整理与分析功能。

下载

何时避免 promise.all()

  1. 独立的异步函数:如果您的请求彼此不依赖,它们可以在不同的时间完成,并且您可以单独处理它们的结果。无需等待所有人一起完成。
  2. 单独的加载状态:就我而言,我为每个请求都有单独的加载旋转器,但我不必要地通过等待这两个请求来阻止一切。最好单独处理每个请求,并在每个请求完成后立即更新 ui。

示例:没有 promise.all() 的独立请求

useeffect(() => {
  getchart();   // trigger first async request
  getdetails(); // trigger second async request
}, []);

在此设置中,两个请求并行运行,无需 promise.all()。您可以显示单独的加载状态并独立处理每个结果,这正是我的项目所需要的。

6. 使用或避免 promise.all() 的现实场景

让我们看看这些概念如何应用于现实场景。

场景1:获取相关数据(使用promise.all())

假设您正在构建一个仪表板,您需要在其中一起显示用户信息和用户购买历史记录。在这种情况下,您需要等待两条信息加载后再渲染 ui。在这里,promise.all() 是正确的选择:

const fetchdata = async () => {
  const [userinfo, purchasehistory] = await promise.all([
    fetchuserinfo(),
    fetchuserpurchasehistory()
  ]);
  console.log('both user info and purchase history loaded');
};

场景 2:独立 api 调用(避免 promise.all())

现在,假设您正在为仪表板获取图表数据和表格数据,并且这两条信息是相互独立的。您可能希望为图表显示一个微调器,并为表格显示一个单独的微调器。在这种情况下,无需等待两个请求一起完成:

useEffect(() => {
  getChart();   // Fire chart request
  getDetails(); // Fire table request
}, []);

这两个请求都是独立的,您可以单独处理每个请求,并在每个请求完成后立即更新 ui。这里不需要 promise.all()。

结论:不要随波逐流

promise.all() 是一个强大的工具,但它并不总是最好的解决方案。我一开始就跟上了潮流,认为在任何地方使用它都会让我的代码变得更好。然而,我很快了解到,在异步函数是独立的并且有自己的加载状态的情况下,promise.all() 实际上会让事情变得更加复杂。

要点:

  • 当您需要等待多个 promise 解决后再继续操作时,请使用 promise.all()。
  • 当异步任务是独立的时,请避免使用 promise.all(),并且您可以单独处理它们,而无需不必要的等待。

最终,重要的是要了解何时以及为何使用 promise.all() 这样的功能,而不是仅仅假设它总是有益的。退后一步并重新评估我的用例后,我发现坚持使用独立的异步调用是正确的方法。

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
promise的用法
promise的用法

“promise” 是一种用于处理异步操作的编程概念,它可以用来表示一个异步操作的最终结果。Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。Promise的用法主要包括构造函数、实例方法(then、catch、finally)和状态转换。

306

2023.10.12

html文本框类型介绍
html文本框类型介绍

html文本框类型有单行文本框、密码文本框、数字文本框、日期文本框、时间文本框、文件上传文本框、多行文本框等等。详细介绍:1、单行文本框是最常见的文本框类型,用于接受单行文本输入,用户可以在文本框中输入任意文本,例如用户名、密码、电子邮件地址等;2、密码文本框用于接受密码输入,用户在输入密码时,文本框中的内容会被隐藏,以保护用户的隐私;3、数字文本框等等。

402

2023.10.12

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

356

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2078

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

348

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

256

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

325

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

412

2023.10.16

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号