您现在的位置是:亿华云 > IT科技类资讯
Promise.any 的作用,如何自己实现一个 Promise.any
亿华云2025-10-09 03:16:39【IT科技类资讯】7人已围观
简介本文转载自微信公众号「三分钟学前端」,作者sisterAn。转载本文请联系三分钟学前端公众号。引言本文从五个方面介绍 Promise.any :Promise.any 的作用 Promi
本文转载自微信公众号「三分钟学前端」,用何作者sisterAn。自己转载本文请联系三分钟学前端公众号。实现
引言
本文从五个方面介绍 Promise.any :
Promise.any 的用何作用 Promise.any 应用场景 Promise.any vs Promise.all Promise.any vs Promise.race 手写 Promise.any 实现下面正文开始
Promise.any
Promise.any() 是 ES2021 新增的特性,它接收一个 Promise 可迭代对象(例如数组),自己
只要其中的实现一个 promise 成功,就返回那个已经成功的用何 promise 如果可迭代对象中没有一个 promise 成功(即所有的 promises 都失败/拒绝),就返回一个失败的自己 promise 和 AggregateError 类型的实例,它是实现 Error 的一个子类,用于把单一的用何错误集合在一起 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 应用场景
从最快的服务器检索资源来自世界各地的用户访问网站,如果你有多台服务器,免费信息发布网自己则尽量使用响应速度最快的实现服务器,在这种情况下,用何可以使用 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); }) 显示第一张已加载的图片(来自MDN)在这个例子,我们有一个获取图片并返回 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 vs Promise.all
Promise.any() 和 Promise.all() 从返回结果来看,它们 彼此相反 :
Promise.all() :任意一个 promise 被 reject ,就会立即被 reject ,并且 reject 的是第一个抛出的错误信息,只有所有的 promise 都 resolve 时才会 resolve 所有的结果 Promise.any() :任意一个 promise 被 resolve ,就会立即被 resolve ,并且 resolve 的是第一个正确结果,云服务器只有所有的 promise 都 reject 时才会 reject 所有的失败信息另外,它们又有不同的 重点 :
Promise.all() 对所有实现都感兴趣。相反的情况(至少一个拒绝)导致拒绝。 Promise.any() 对第一个实现感兴趣。相反的情况(所有拒绝)导致拒绝。Promise.any vs Promise.race
Promise.any() 和 Promise.race() 的 关注点 不一样:
Promise.any() :关注于 Promise 是否已经解决 Promise.race() :主要关注 Promise 是否已经解决,无论它是被解决还是被拒绝手写 Promise.any 实现
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
很赞哦!(7826)
相关文章
热门文章
站长推荐
当投资者经过第二阶段的认真学习之后又充满了信心,认为自己可以在市场上叱咤风云地大干一场了。但没想到“看花容易绣花难”,由于对理论知识不会灵活运用.从而失去灵活应变的本能,就经常会出现小赢大亏的局面,结果往往仍以失败告终。这使投资者很是困惑和痛苦,不知该如何办,甚至开始怀疑这个市场是不是不适合自己。在这种情况下,有的人选择了放弃,但有的意志坚定者则决定做最后的尝试。
必备,前台与后台分离的架构实践
分音塔CTO张明:深耕旅游行业,运用AI技术解决跨语言沟通问题
百度大牛总结十条Python面试题陷阱,看看你是否会中招
互联网中的地址是数字的IP地址,域名解析的作用主要就是为了便于记忆。
2018年程序员跳槽最全攻略
华为员工自曝百万级年终奖,论坛征女友!
如何使用ncurses进行颜色编程