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

描绘成功和失败的未来

卫弘图
2023-03-14

我有一个未来[T],我想在成功和失败上映射结果。

比如说

val future = ... // Future[T]
val mapped = future.mapAll { 
  case Success(a) => "OK"
  case Failure(e) => "KO"
}

如果我使用< code>map或< code>flatmap,它将只映射成功的未来。如果我使用< code>recover,它将只映射失败的期货。< code>onComplete执行回调,但不返回修改后的未来值。< code>Transform可以工作,但是需要两个函数而不是一个部分函数,所以有点难看。

我知道我可以做出一个新的promise,并用onCompleteonSuccess/onFailure完成它,但我希望我缺少一些东西,可以让我用一个PF完成上述工作。

共有3个答案

戴正阳
2023-03-14

地图和平面地图变体:

implicit class FutureExtensions[T](f: Future[T]) {
  def mapAll[Target](m: Try[T] => Target)(implicit ec: ExecutionContext): Future[Target] = {
    val promise = Promise[Target]()
    f.onComplete { r => promise success m(r) }(ec)
    promise.future
  }

  def flatMapAll[Target](m: Try[T] => Future[Target])(implicit ec: ExecutionContext): Future[Target] = {
    val promise = Promise[Target]()
    f.onComplete { r => m(r).onComplete { z => promise complete z }(ec) }(ec)
    promise.future
  }
}
邹星火
2023-03-14
匿名用户

从Scala 2.12开始,您可以使用< code>transform来映射这两种情况:

future.transform {
      case Success(_) => Try("OK")
      case Failure(_) => Try("KO")
}

如果您喜欢使用< code>Future而不是< code>Try,也可以使用< code>transformWith。有关详细信息,请查看文档。

丰赞
2023-03-14

编辑2017-09-18:从Scala 2.12开始,有一个转换方法,它采用尝试[T]=

val future = ... // Future[T]
val mapped = future.transform {
  case Success(_) => Success("OK")
  case Failure(_) => Success("KO")
}

对于2.11.x,以下内容仍然适用:

好了,你不能直接用一个PF来做这件事。而变换变换是可丢弃的=

val mapped: Future[String] = future.map(_ => "OK").recover{case _ => "KO"}

也就是说,实现mapAll很简单:

implicit class RichFuture[T](f: Future[T]) {
  def mapAll[U](pf: PartialFunction[Try[T], U]): Future[U] = {
    val p = Promise[U]()
    f.onComplete(r => p.complete(Try(pf(r))))
    p.future
  }
}

 类似资料:
  • 我正在使用和学习。 我不明白,使用< code >回调方法完成未来和使用promise之间的确切区别是什么? 这是否意味着未来回调方法实际上没有完成未来?只有使用promise,我们才能完成未来? 还有,我见过很多像你这样的地方,既可以阅读期货,也可以阅读无极,但你只能写信给无极。

  • 问题内容: 如果我有一个如下所示的SQL表,该如何计算当前的赢或输连胜(以及按季节对赢/输连胜进行分组/重置)。我想更新表并为每条记录填写条纹。 因此,对于#1,条纹将为“ -1”,#2将为“ 1”,#3将为“ 2”,但是一旦我们降至#7,它将再次重置为“ 1”。(+1表示“赢得1场比赛”,-1表示“失去1场比赛”,依此类推。) 问题答案: 对于每个游戏,计算与之前结果相同的游戏,这样就不会有中间

  • 我实现了以下代码来处理我未来的完成,它编译得很好 我对它的工作原理有点困惑,我假设它确实如此,因为我从Scala文档中的类似示例中复制了它 我知道onComplete需要一个函数,该函数将尝试作为输入,成功和失败都是从尝试扩展而来的case类 我不明白的是,如果不首先进行某种类型的匹配,你怎么能在这些情况下进行。 这怎么可能在这里?

  • 我正在尝试使用Web客户端创建REST调用 我只想记录通话结果。成功时 - 使用响应正文记录成功消息,在 5XX 或超时或其他时 - 记录错误消息。日志应该在后台创建(而不是由创建调用的线程创建)但是每次都会执行,工作正常,但也有 记录在日志文件中。 我也在一些教程中看到过方法,但在我的设置中有这样的方法。 如何记录成功和失败消息?

  • 问题内容: 以前,在Rails 2.3.8中,我使用了原型帮助器和(以及其他)。 这些选项如下: (来自文档的示例)。此示例将在成功后用类“ cart”更新html元素,而在失败时将类“ error”更新。 现在我相信操作方式已经改变,我们写: 并且没有设置选项了。现在,代替普通的html,我们渲染javascript,如下所示(在jquery中): 但是您如何处理错误情况?我可以在控制器中处理它

  • JS POST 不执行 fetch(url ,直接到 catch(ex){FR.Logger.error(ex);FR.Msg.toast(FR.i18nText('Custom')+'JS'+FR.i18nText('Error')+' : '+ex.message);}}).createDelegate(this, [], 0).apply(this, arguments) 代码如下