【发布时间】:2022-11-06 08:41:04
【问题描述】:
我需要得到返回的 Javascript Promise 的结果最快的,但我想继续调用封装在其他 2 个“失败”承诺中的逻辑,无论谁获胜。下面的例子。
// The 3 promises I care about
const fetchFromGoogle: Promise<T> = googlePromise()
const fetchFromAmazon: Promise<T> = amazonPromise()
const fetchFromCloudflare: Promise<T> = cloudflarePromise()
// The promise that invoked its logic the fastest
const winner: T = Promise.race([fetchFromGoogle, fetchFromAmazon, fetchFromCloudflare])
在这种情况下,如果 fetchFromAmazon 调用在速度方面获胜,那么我会将结果返回给客户端,但继续异步运行其他两个 Promise。
这是在Cloudflare Worker 中执行的,在继续评估其他函数的同时返回获胜承诺的能力将通过下面链接的waitUntil API 得到支持。
我评估了两个选项:
- 一些我不知道的 Javascript API 可以为我做这件事
- 使用this 之类的东西来确定哪些承诺丢失并使用
Cloudflare Workerscontext.waitUntil 调用运行它们,这将确保逻辑将继续评估,尽管已将结果返回给客户端。据我了解,
Promise.All不会满足此标准,因为在我们等待所有 3 项完成时,我永远不会提前返回获胜的承诺。
【问题讨论】:
-
看看
Promise.race的出处。它非常容易实现,而不是某种只有浏览器才能提供的神奇 API。它只是遍历您的数组并在每个承诺上调用then()。那是你应该开始的地方。 -
@Evert 对我在 (2) 下面提出的解决方案的任何意见。我认为这可能是我眼中最好的,因为这意味着我有点分开
Promise.race
标签: javascript typescript async-await promise cloudflare-workers