当前位置: 首页 > 知识库问答 >
问题:

如何管理一套阿卡期货

熊朝
2023-03-14

我有一组Future[T],我想将其管理到我正在编写的库的单个对象中。在我当前的实现中,我使用的是未来。按顺序收集它们,并等待它们解决,这样我就可以对它们做未来的事情(映射、收集、过滤)。然而,这只会让我有能力在成功或失败时进行匹配,这不一定是我正在处理的期货集合的情况。有些会失败,有些会成功,我希望能够从成功者中提取出我能提取的值,并收集其他人的异常和错误,以便我能够适当地升级它们。在伪代码中,它类似于

Future.sequence(Set[Future[T]]) andThen {
  case FullSuccess => "woot"
  case SomeErrors  => "well, that's still ok."
  case FullErrors  => "Ok, who's the wise guy."
}

我真正寻找的是在有数据的地方有数据,如果序列中只有一个期货失败,就不必返回完全失败。

谢谢你的帮助。

共有1个答案

师曦
2023-03-14

不幸的是,您的案例没有内置帮助程序,但很容易创建自己的帮助程序:

import scala.concurrent.{Await, Future}
import scala.util.{Failure, Success, Try}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.DurationInt

def sequenceOfTries[T](futures: Seq[Future[T]]): Future[Seq[Try[T]]] =
  futures.foldLeft(Future.successful(List[Try[T]]())) {
    case (accF, f) => accF.flatMap {
      acc => f.map(v => Success(v) :: acc).recover { case ex => Failure(ex) :: acc }
    }
  }.map(_.reverse)


val v = Seq(
  Future.successful(1),
  Future.failed(new IllegalStateException("2")),
  Future.successful(3),
  Future.failed(new IllegalStateException("4"))
)

Await.result(sequenceOfTries(v), 1.second)

结果:

v: Seq[scala.concurrent.Future[Int]] = List(scala.concurrent.impl.Promise$KeptPromise@2416f7e5, scala.concurrent.impl.Promise$KeptPromise@2aaf675d, scala.concurrent.impl.Promise$KeptPromise@360d48f, scala.concurrent.impl.Promise$KeptPromise@230f8be2)    

res0: Seq[scala.util.Try[Int]] = List(Success(1), Failure(java.lang.IllegalStateException: 2), Success(3), Failure(java.lang.IllegalStateException: 4))

UPD。或者,您可以在将来使用。序列如下(结果相同):

def sequenceOfTries[T](futures: Seq[Future[T]]): Future[Seq[Try[T]]] =
  Future.sequence(futures.map(_.map(x => Success(x)).recover { case ex => Failure(ex) }))
 类似资料:
  • 你可以根据实际需要,为企业设置灵活的打卡规则。企业微信在管理后台为你提供了十分精细的打卡设置,充分照顾每个企业的特性,满足固定上下班、外出打卡、排班、自由上下班等考勤需求。员工打开手机轻松打卡,无需排队,打卡更便捷。 如何添加打卡规则 设置入口:【管理后台】>【企业应用】>【打卡】>【上下班打卡】>【设置】>【添加规则】查看 1 / 选择规则类型 在上下班打卡中,有三种打卡规则可选: 固定时间上下

  • 2.2 账户卡管理 2.2.1 发起绑卡 【场景介绍】 用户账户可以绑定银行卡(信用卡或借记卡),以便实现充值、提现、转账、绑卡支付等操作。 【重要说明】根据相关法规要求,用户的银行卡信息需要第三方支付机构收集,所以用户的该操作需要在钱麦页面完成,故需要商户端发起用户账户绑卡的请求,且在用户操作完成之后,钱麦将结果同步\/异步反馈给商户,返回商户端页面。 【调用流程】 【请求地址】 环境 接口服务

  • 我已经和Cassandra合作了一段时间,并遵循了以下链接中的基准测试提示: http://www.datastax.com/dev/blog/how-not-to-benchmark-cassandra 我有4个节点运行Cassandra,2个不同的节点使用本机基准测试工具“cassandra-stress”为集群提供数据。我知道,由于Cassandra写操作的LSM特性,它们很难绑定到IO,但

  • 从2.6开始,我在这一行收到了弃用警告: 警告: 对象ActorMaterializer中的方法apply已被弃用(从2.6.0开始):使用具有流属性或配置设置的系统范围的materializer来更改默认值 我不明白那个信息,我该怎么办?什么是“全系统物化器”,它位于某个akka包中?

  • 我想在我的ScrollView及其子视图上检测手势。我希望所有这些onClick方法也能工作。假设有一个被LinearLayout包围的按钮,整个按钮被ScrollView包围。当用户在滚动视图的任何地方滑动时,我想调用一个动作..< br >我将onTouchListener应用于ScrollView..但是由于LinearLayout是可点击的,所以当我滑过linear layout时,事件不

  • 我需要的每个项目都有多个SQL查询。我的问题是,我所有的项目都需要Workbase中相同的MySQL连接。 因此,我一直打开着大量的SQL选项卡,如下所示: 由于选项卡的数量超过了显示器的宽度,因此我必须左右滚动才能找到一些查询。唯一的方法是单击两个箭头(屏幕截图的右侧)。这真的很不清楚,也很烦人。 有没有更好的处理方法?是否可以在多个SQL选项卡之间快速切换,或者以另一种方式排列?