gpt4 book ai didi

ecmascript-6 - 给定 promise 列表,您如何实现 "raceToSuccess"助手?

转载 作者:行者123 更新时间:2023-12-03 12:02:28 24 4
gpt4 key购买 nike

我对 ES6 Promise API 中的某些内容感到困惑。我可以看到一个明确的用例,即并发提交多个异步作业,并在第一次成功时“解决”。例如,这将适用于多个等效服务器可用的情况,但有些服务器可能已关闭,而其他服务器负载很重且速度较慢,因此我的目标是从第一个成功获得响应,而忽略其余服务器(是的,我知道从服务器的角度来看,这对于客户端的行为来说是一种令人讨厌的方式,但它对最终用户来说很棒;)

但是,据我所知,我可以玩“所有”或“种族”行为。 “所有”行为似乎要等到所有请求都完成后,这意味着我必须等待最慢的,即使服务器已经完成(实际上,我可能不得不等待超时,这将是一场灾难对于这种情况。)然而,“种族”行为似乎让我第一个完成,如果这恰好是失败,也是一场灾难。

API 中是否有允许“raceToSuccess”类型行为的内容,或者我是否必须手动构建它。就此而言,我将如何手工构建它?

作为旁注,我在 Java 8 CompletableFuture 中发现了同样的难题,它似乎是一个紧密并行的 API。那么,我是否在哲学层面上遗漏了一些东西?

最佳答案

这是一个经典的例子,其中反转你的逻辑使它更清晰。在这种情况下,您的“种族”是您希望您的拒绝行为实际上是成功行为。

function oneSuccess(promises){
return Promise.all(promises.map(p => {
// If a request fails, count that as a resolution so it will keep
// waiting for other possible successes. If a request succeeds,
// treat it as a rejection so Promise.all immediately bails out.
return p.then(
val => Promise.reject(val),
err => Promise.resolve(err)
);
})).then(
// If '.all' resolved, we've just got an array of errors.
errors => Promise.reject(errors),
// If '.all' rejected, we've got the result we wanted.
val => Promise.resolve(val)
);
}

关于ecmascript-6 - 给定 promise 列表,您如何实现 "raceToSuccess"助手?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37234191/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com