本文转载自微信公众号「三分钟学前端」,作者sisterAn。转载本文请联系三分钟学前端公众号。

本文从五个方面介绍 Promise.any :
下面正文开始
Promise.any() 是 ES2021 新增的特性,它接收一个 Promise 可迭代对象(例如数组),
- const promises = [
 - Promise.reject('ERROR A'),
 - Promise.reject('ERROR B'),
 - Promise.resolve('result'),
 - ]
 - Promise.any(promises).then((value) => {
 - console.log('value: ', value)
 - }).catch((err) => {
 - console.log('err: ', err)
 - })
 - // value: result
 
如果所有传入的 promises 都失败:
- const promises = [
 - Promise.reject('ERROR A'),
 - Promise.reject('ERROR B'),
 - Promise.reject('ERROR C'),
 - ]
 - Promise.any(promises).then((value) => {
 - console.log('value:', value)
 - }).catch((err) => {
 - console.log('err:', err)
 - console.log(err.message)
 - console.log(err.name)
 - console.log(err.errors)
 - })
 - // err:AggregateError: All promises were rejected
 - // All promises were rejected
 - // AggregateError
 - // ["ERROR A", "ERROR B", "ERROR C"]
 
来自世界各地的用户访问网站,如果你有多台服务器,则尽量使用响应速度最快的服务器,在这种情况下,可以使用 Promise.any() 方法从最快的服务器接收响应
- function getUser(endpoint) {
 - return fetch(`https://superfire.${endpoint}.com/users`)
 - .then(response => response.json());
 - }
 - const promises = [getUser("jp"), getUser("uk"), getUser("us"), getUser("au"), getUser("in")]
 - Promise.any(promises).then(value => {
 - console.log(value)
 - }).catch(err => {
 - console.log(err);
 - })
 
在这个例子,我们有一个获取图片并返回 blob 的函数,我们使用 Promise.any() 来获取一些图片并显示第一张有效的图片(即最先 resolved 的那个 promise)
- function fetchAndDecode(url) {
 - return fetch(url).then(response => {
 - if(!response.ok) {
 - throw new Error(`HTTP error! status: ${response.status}`);
 - } else {
 - return response.blob();
 - }
 - })
 - }
 - let coffee = fetchAndDecode('coffee.jpg');
 - let tea = fetchAndDecode('tea.jpg');
 - Promise.any([coffee, tea]).then(value => {
 - let objectURL = URL.createObjectURL(value);
 - let image = document.createElement('img');
 - image.src = objectURL;
 - document.body.appendChild(image);
 - })
 - .catch(e => {
 - console.log(e.message);
 - });
 
Promise.any() 和 Promise.all() 从返回结果来看,它们 彼此相反 :
另外,它们又有不同的 重点 :
Promise.any() 和 Promise.race() 的 关注点 不一样:
Promise.any 只要传入的 promise 有一个是 fullfilled 则立即 resolve 出去,否则将所有 reject 结果收集起来并返回 AggregateError
- MyPromise.all = function(promises){
 - return new Promise((resolve,reject)=>{
 - promises = Array.isArray(promises) ? promises : []
 - let len = promises.length
 - // 用于收集所有 reject
 - let errs = []
 - // 如果传入的是一个空数组,那么就直接返回 AggregateError
 - if(len === 0) return reject(new AggregateError('All promises were rejected'))
 - promises.forEach((promise)=>{
 - promise.then(value=>{
 - resolve(value)
 - },err=>{
 - len--
 - errs.push(err)
 - if(len === 0){
 - reject(new AggregateError(errs))
 - }
 - })
 - })
 - })
 - }
 
来自:https://github.com/sisterAn/blog
                分享文章:Promise.any的作用,如何自己实现一个Promise.any
                
                本文地址:http://www.csdahua.cn/qtweb/news35/434485.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网