当前位置:首页 > 文章列表 > 文章 > 前端 > Promiseall( ) 困境:什么时候有帮助,什么时候有害

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

来源:dev.to 2024-09-27 19:01:00 0浏览 收藏

小伙伴们对文章编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《Promiseall( ) 困境:什么时候有帮助,什么时候有害》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

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

何时避免 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() 这样的功能,而不是仅仅假设它总是有益的。退后一步并重新评估我的用例后,我发现坚持使用独立的异步调用是正确的方法。

本篇关于《Promiseall( ) 困境:什么时候有帮助,什么时候有害》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!

版本声明
本文转载于:dev.to 如有侵犯,请联系study_golang@163.com删除
RTX 40 系显卡加持,ProArt 创 16 2024 立减 2000 元助力 Studio 创意设计RTX 40 系显卡加持,ProArt 创 16 2024 立减 2000 元助力 Studio 创意设计
上一篇
RTX 40 系显卡加持,ProArt 创 16 2024 立减 2000 元助力 Studio 创意设计
JavaScript 机器学习入门:TensorFlowjs 初学者指南
下一篇
JavaScript 机器学习入门:TensorFlowjs 初学者指南
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ljg-skills -
    ljg-skills
    ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
    2486次使用
  • MELO音乐 - AI 音乐生成平台,支持多模态创作能力
    MELO音乐
    MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
    2298次使用
  • UniScribe - AI 免费在线音视频转文字平台
    UniScribe
    UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
    2243次使用
  • 剧云 - 免费 AI 智能中文剧本创作平台
    剧云
    剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
    2443次使用
  • 万象有声 - AI 一站式有声内容创作平台
    万象有声
    万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
    2420次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码