问题描述
我需要向多服务器发送请求,以查看哪个服务器将响应我的请求,如果其中任何一个响应,我将进一步与该服务器交互。最简单的方法是按顺序发送我的请求,像这样
async function probing(servers) {
for (const server of servers) {
const result = await fetch(server)
if (result.status == 200) {
return result
}
}
}
但我希望加快探测过程,所以我将代码更改为
async function probing(servers) {
results = await Promise.all(
servers.map(async server => {
return await fetch(server)
})
)
for (const result of results) {
if (result.status == 200) return result
}
}
但我仍然需要等待所有的承诺完成。我真正需要的是,如果其中一个有决心,我就从我的探测中返回()
可以吗?
----更新----
感谢评论 promise.any 是解决方案(单线箭头函数可以进一步简化如下)
result = await Promise.any(
servers.map(server => fetch(server))
)
---- 更新 2 ----
我原以为Promise.any 是要走的路,也是故事的结局。但不幸的是,事实并非如此! Promise.any 仅适用于 Chrome 85+ 和 FF 79+,不像 Promise.all 可用于除 IE 之外的任何现代浏览器,请查看此处https://v8.dev/features/promise-combinators
我的客户需要我从 2020 年开始支持 Chrome 版本,即 Chrome 80+, 我尝试使用 Babel 对 Promise.any 进行 polyfill,但我失败了。
我们使用 babel6,但我未能使用 babel6 对 Promise.any 进行 polyfill。我尝试升级到 babel7(带有 npx babel-upgrade --write
和一些曲折),现在使用 Promise.any() 的捆绑代码甚至无法用于 chrome 88。我为此问了另一个问题How do I polyfill Promise.any() using babel 7?
所以现在我只需要恢复到 Promise.all。
---- 更新 3 ----
我终于用 Babel 7 制作了 polyfill Promise.any()
,关键是使用 core-js@3
和正确的 babelrc 设置(我不确定我是否全部正确),请参考我的问答
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)