当任何承诺已经履行时,是否有可能脱离 await Promise.all (Chrome 80)

问题描述

我需要向多服务器发送请求,以查看哪个服务器将响应我的请求,如果其中任何一个响应,我将进一步与该服务器交互。最简单的方法是按顺序发送我的请求,像这样

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 (将#修改为@)