首页 > 其他分享 >Promise.all、Promise.race、Promise.any

Promise.all、Promise.race、Promise.any

时间:2022-09-29 16:36:40浏览次数:49  
标签:返回 resolve 成功 race promise reject Promise any


Pomise.all

定义

Promise.all()方法接收一个promise的iterable类型(注:Array,Map,Set都属于ES6的iterable类型)的输入,并且只返回一个Promise实例,那个输入的所有promise的resolve回调的结果是一个数组。这个Promise的resolve回调执行是在所有输入的promise的resolve回调都结束,或者输入的iterable里没有promise了的时候。它的reject回调执行是,只要任何一个输入的promise的reject回调执行或者输入不合法的promise就会立即抛出错误,并且reject的是第一个抛出的错误信息。

说明

此方法在集合多个 promise 的返回结果时很有用。
完成(Fulfillment):
如果传入的可迭代对象为空,Promise.all 会同步地返回一个已完成(resolved)状态的promise。
如果所有传入的 promise 都变为完成状态,或者传入的可迭代对象内没有 promise,Promise.all 返回的 promise 异步地变为完成。
在任何情况下,Promise.all 返回的 promise 的完成状态的结果都是一个数组,它包含所有的传入迭代参数对象的值(也包括非 promise 值)。
失败/拒绝(Rejection):
如果传入的 promise 中有一个失败(rejected),Promise.all 异步地将失败的那个结果给失败状态的回调函数,而不管其它 promise 是否完成。

Promise.all可以将多个Promise实例包装成一个新的Promise实例。同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值。

let p1 = new Promise((resolve, reject) => {
resolve('成功了')
})

let p2 = new Promise((resolve, reject) => {
resolve('success')
})

let p3 = Promse.reject('失败')

Promise.all([p1, p2]).then((result) => {
console.log(result) //['成功了', 'success']
}).catch((error) => {
console.log(error)
})

Promise.all([p1,p3,p2]).then((result) => {
console.log(result)
}).catch((error) => {
console.log(error) // 失败了,打出 '失败'
})

Promse.all在处理多个异步处理时非常有用,比如说一个页面上需要等两个或多个ajax的数据回来以后才正常显示,在此之前只显示loading图标。

代码模拟:

let wake = (time) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(`${time / 1000}秒后醒来`)
}, time)
})
}

let p1 = wake(3000)
let p2 = wake(2000)

Promise.all([p1, p2]).then((result) => {
console.log(result) // [ '3秒后醒来', '2秒后醒来' ]
}).catch((error) => {
console.log(error)
})

需要特别注意的是,Promise.all获得的成功结果的数组里面的数据顺序和Promise.all接收到的数组顺序是一致的,即p1的结果在前,即便p1的结果获取的比p2要晚。这带来了一个绝大的好处:在前端开发请求数据的过程中,偶尔会遇到发送多个请求并根据请求顺序获取和使用数据的场景,使用Promise.all毫无疑问可以解决这个问题。

Promse.race

定义

Promise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。

说明

race 函数返回一个 Promise,它将与第一个传递的 promise 相同的完成方式被完成。它可以是完成( resolves),也可以是失败(rejects),这要取决于第一个完成的方式是两个中的哪个。
如果传的迭代是空的,则返回的 promise 将永远等待。
如果迭代包含一个或多个非承诺值和/或已解决/拒绝的承诺,则 Promise.race 将解析为迭代中找到的第一个值。

返回第一个 Promise。
顾名思义,Promse.race就是赛跑的意思,意思就是说,Promise.race([p1, p2, p3])里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态。

let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('success')
},1000)
})

let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
reject('failed')
}, 500)
})

Promise.race([p1, p2]).then((result) => {
console.log(result)
}).catch((error) => {
console.log(error) // 打开的是 'failed'
})

Promise.any

定义

Promise.any() 接收一个Promise可迭代对象,只要其中的一个 promise 成功,就返回那个已经成功的 promise 。如果可迭代对象中没有一个 promise 成功(即所有的 promises 都失败/拒绝),就返回一个失败的 promise 和AggregateError类型的实例,它是 Error 的一个子类,用于把单一的错误集合在一起。本质上,这个方法和Promise.all()是相反的。
这个方法用于返回第一个成功的 promise 。只要有一个 promise 成功此方法就会终止,它不会等待其他的 promise 全部完成。
不像 Promise.all() 会返回一组完成值那样(resolved values),我们只能得到一个成功值(假设至少有一个 promise 完成)。当我们只需要一个 promise 成功,而不关心是哪一个成功时此方法很有用的。
同时, 也不像 Promise.race() 总是返回第一个结果值(resolved/reject)那样,这个方法返回的是第一个 成功的 值。这个方法将会忽略掉所有被拒绝的 promise,直到第一个 promise 成功。

说明

这个方法用于返回第一个成功的 promise 。只要有一个 promise 成功此方法就会终止,它不会等待其他的 promise 全部完成。
不像 Promise.all() 会返回一组完成值那样(resolved values),我们只能得到一个成功值(假设至少有一个 promise 完成)。当我们只需要一个 promise 成功,而不关心是哪一个成功时此方法很有用的。
同时, 也不像 Promise.race() 总是返回第一个结果值(resolved/reject)那样,这个方法返回的是第一个 成功的 值。这个方法将会忽略掉所有被拒绝的 promise,直到第一个 promise 成功。

返回第一个成功的 promise 。


标签:返回,resolve,成功,race,promise,reject,Promise,any
From: https://blog.51cto.com/u_15812097/5723434

相关文章

  • 手写Promise
    什么是Promise?所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。P......
  • Js手写面试题5-Promise
    Promise❓有任何疑问都可以私信我解答⚡仓库地址:https://gitee.com/super_li_yu/promise......
  • [Typescript] 39. Medium - AnyOf
    ImplementPythonliked any functioninthetypesystem.AtypetakestheArrayandreturns true ifanyelementoftheArrayistrue.IftheArrayisempty,......
  • Promises/A+知识及其实现过程
    promise核心要点Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。待定(pending):初始状态,既没有被兑现,也没有被拒绝。已成......
  • JavaScript中Promise详解
    概述Promise(期约)对象用于表示一个异步操作的最终完成(或失败)及其结果值。Promise的使用Promise创建时需传入一个执行器函数(excutor)接受两个参数,第一个参数是内部定......
  • Javaweb项目报错:MySQLNonTransientConnectionException: message from server: "Too
    错误描述:运行Javaweb时出现的错误,是在项目成功运行后,进行了几次页面跳转操作或数据库DML操作后出现的报错截图如下:解决方案:调整最大连接数重启mysql服务器servicem......
  • 【Azure 应用服务】App Service频繁出现 Microsoft.WindowsAzure.Diagnostics.Diagnos
    问题描述在使用AppService的过程中,发现应用频繁出现503错误,通过Kudu站点获取到Logfiles。在Eventlog.xml文件中,发现大量的Microsoft.WindowsAzure.Diagnostics.Diag......
  • 创建小程序打开报错--Unhandled promise rejection
    遇到的问题:刚创建完小程序打开,发现抱错--Unhandledpromiserejection(env:Windows,mp,1.05.2204250;lib:2.26.1)原因:版本太高解决办法:在右上角点击详情,找到......
  • 照猫画虎之实现Promise
     //promise(丑陋的)classUglyPromise{constructor(callback){this.status='pending'this.value=undefinedthis.sucessCb=[]this.fail......
  • Many Many Paths(组合计数)
    题意给定\(r1,c1,r2,c2\),求\(\sum\limits_{i=r1}^{r2}\sum\limits_{j=c1}^{c2}f(i,j)\),其中\(f(i,j)\)表示从\((0,0)\)往上或者往右走到\((i,j)\)的方案数。题目链......