首页 > 其他分享 >用Promise解决并发

用Promise解决并发

时间:2024-01-26 18:26:52浏览次数:28  
标签:返回 const 迭代 并发 race Promise reject 解决

前提

假设有两个或多个网络请求函数

如果使用asyn/await,假设一个请求需要2s,那么总共需要4s

如果使用并发,则两秒即可完成两个请求

const getA => () {
    return Promise((resolve, reject) => {
        setTimeout(() => {
          reject('reject')
        }, 2000)
    })
}

const getB => () {
    return Promise((resolve, reject) => {
        setTimeout(() => {
          resolve('resolve')
        }, 2100)
    })
}

Promise.all()

 Promise.all() 静态方法接受一个 Promise 可迭代对象作为输入,并返回一个 Promise。当所有输入的 Promise 都被兑现时,返回的 Promise 也将被兑现(即使传入的是一个空的可迭代对象),并返回一个包含所有兑现值的数组。如果输入的任何 Promise 被拒绝,则返回的 Promise 将被拒绝,并带有第一个被拒绝的原因。

简单来说:全部Promise是成功的则返回所有Promise,如果存在一个被拒绝的则返回被拒绝的Promise

async function getData() {
  const [A, B] = await Promise.all([
    getA(),
    getB()
  ])
  console.log('getData', A, B) //reject
}

 Promise.race()

Promise.race() 静态方法接受一个 promise 可迭代对象作为输入,并返回一个 Promise。这个返回的 promise 会随着第一个 promise 的敲定而敲定。

简单来说:只返回第一个返回结局的Promise,无论成功与否

async function getData() {
  const race = Promise.race([
    getA(),
    getB()
  ])
  try {
    const result = await race
    console.log('result', race)
  } catch (err) {
    console.log('err', err) // reject
  }
}

Promise.any()

Promise.any() 静态方法将一个 Promise 可迭代对象作为输入,并返回一个 Promise。当输入的任何一个 Promise 兑现时,这个返回的 Promise 将会兑现,并返回第一个兑现的值。当所有输入 Promise 都被拒绝(包括传递了空的可迭代对象)时,它会以一个包含拒绝原因数组的AggregateError拒绝。

简单来说:返回第一个成功的Promise,即使在这之前有被拒绝的Promise出现。如果全都被拒绝则返回一个拒绝Promise数组

const anyPromise = Promise.any([
    getA().catch(reject),
    getB().catch(reject)
])

Peomise.allSettled()

Promise.allSettled() 静态方法将一个 Promise 可迭代对象作为输入,并返回一个单独的Promise。当所有输入的 Promise 都已敲定时(包括传入空的可迭代对象时),返回的 Promise 将被兑现,并带有描述每个 Promise 结果的对象数组。

简单来说:每个Promise互不依赖,将会返回所有Promise结果,无论成功与否

async function getData() {
  const [A, B] = await Promise.allSettled([
    getA(),
    getB()
  ])
  console.log('data', A, B)
}

 

标签:返回,const,迭代,并发,race,Promise,reject,解决
From: https://www.cnblogs.com/karle/p/17990417

相关文章

  • 04.性能测试解决方案
    性能监控系统价值性能监控体系介绍性能监控价值性能监控是什么对应用的多样化性能指标进行持续性收集、存储、分析和可视化。性能监控价值提升性能分析能力可以快速发现性能瓶颈辅助针对性的解决问题提高实时反馈与响应能力性能监控应用场景时序......
  • markdown图床问题解决
    写博客不仅要以文字形式记录,更重要的是把自己曾经的截图记录下来,更方便下次使用。所以有必要搞一个稳定的图床生成图片链接。一开始我是用的Github,新建一个仓库上传图片,优点是方便,缺点是网络不用魔法图片经常加载不出来。后来看到网上一些博主推荐使用七牛云图片存储,为此我购买......
  • el-input el-tree组件 问题:blur先于click触发怎么解决
    页面构造 使用mousedowm触发比blur更早,因为是组件所以得使用native,prevent阻止默认事件然后this.$refs.parentInput.focus();让焦点保持,点击展开或关闭箭头时候让焦点存在,点击节点的时候让页面关闭要兼容筛选效果,做了一个临时tempNode用于存放之前选择的对象,这样当在未进......
  • OpenAI 宣布将通过更新解决 GPT-4 变懒问题丨 RTE 开发者日报 Vol.135
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表......
  • 新能源汽车智慧充电桩解决方案:移动便捷的充电服务
    自从我国提出"新基建"以来,充电基础设施产业也成为行业的话题与关注焦点。"十三五"期间,我国充电基础设施实现了跨越式发展,标准体系逐步完备,产业生态稳步形成。国务院《新能源汽车产业发展规划(2021-2035年)的通知》指出,到"十四五"末,我国电动汽车充电保障能力进一步提升,形成适度超前、......
  • CAN转PROFINET新应用,节能降本又高效,AGV行业西门子PLC与CAN驱动系统连接通信解决方案
    大家好,我今天给大家讲解一个AGV行业西门子PLC与CAN驱动系统连接通信解决方案(CAN转PROFINET)随着工厂自动化发展以及柔性制造系统、自动化立体仓库的广泛应用,已作为管理离散型装配、物流、仓储等系统不可或缺的自动化搬运装卸工具,智能化AGV系统可根据ERP订单进行仓库配料、分料、产......
  • 分钟级实时数据分析的背后——实时湖仓产品解决方案
    随着信息技术的深入应用,企业对市场的响应速度也在不断提升,而且这种响应速度正在变得越来越快,没有最快只有更快。对数据实时性要求的提高,是眼下很多企业遇到的一个新的挑战。从生产侧的视角来看,系统实时监控与实时健康状态检测已成为确保系统稳定性和可靠性不可或缺的关键功能。它们......
  • vue3 解决导航栏和header之间的空白
    vue3解决导航栏和header之间的空白现象如下图所示,导航栏和header之间有白色空隙 解决components\CommonAside.vue修改样式,添加如下代码</style>.el-menu{height:100vh;border-right:none;h3{color:#fff;text-align:center;......
  • 3dmax效果图渲染出现曝光怎么才能解决?
    面对3dsMax渲染中曝光过度的问题,通常由于相机设定、场景照明或渲染参数不正确造成。适当调整这些因素至关重要,不仅能让渲染作品实现所需的真实与视觉效果,还能大幅提升其整体质量。本文将概述解决这一渲染难题的方法。3dmax效果图渲染出现曝光解决方法第一步按下F10,打开渲染面......
  • 分钟级实时数据分析的背后——实时湖仓产品解决方案
    随着信息技术的深入应用,企业对市场的响应速度也在不断提升,而且这种响应速度正在变得越来越快,没有最快只有更快。对数据实时性要求的提高,是眼下很多企业遇到的一个新的挑战。从生产侧的视角来看,系统实时监控与实时健康状态检测已成为确保系统稳定性和可靠性不可或缺的关键功能。它......