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 已经可以高效地处理异步任务而无需将所有内容组合在一起时,我意识到了这一点。

微信 WeLM
微信 WeLM

WeLM不是一个直接的对话机器人,而是一个补全用户输入信息的生成模型。

下载

何时避免 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不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

559

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

437

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

776

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

479

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

554

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

1091

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

659

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

554

2023.09.20

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

26

2026.01.26

热门下载

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

精品课程

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

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