Scala中普通同步流中异步代码的混合 你认为最好的Scala解决方案是,你有一些简单的同步函数调用链,你需要在中间中间添加一个异步动作而不阻塞?

Scala中普通同步流中异步代码的混合 你认为最好的Scala解决方案是,你有一些简单的同步函数调用链,你需要在中间中间添加一个异步动作而不阻塞?,scala,asynchronous,Scala,Asynchronous,我认为未来需要重构现有代码以回调意大利面,通过以前的同步函数调用链将未来一路拴在一起,或者在每个间隔轮询承诺,虽然不是很理想,但可能我在这里遗漏了一些琐碎/合适的选项 对于(akka)参与者的重构,似乎需要为这样一个简单的工程壮举准备大量的样板文件 如何在现有同步流中插入异步函数,而不阻塞,也不进入大量样板文件 现在在我的代码中,我用Await.result阻塞,这仅仅意味着线程正在休眠…一个简单的肮脏技巧: 假设你有: def f1Sync: T1 def f2Sync: T2 ... def

我认为未来需要重构现有代码以回调意大利面,通过以前的同步函数调用链将未来一路拴在一起,或者在每个间隔轮询承诺,虽然不是很理想,但可能我在这里遗漏了一些琐碎/合适的选项

对于(akka)参与者的重构,似乎需要为这样一个简单的工程壮举准备大量的样板文件

如何在现有同步流中插入异步函数,而不阻塞,也不进入大量样板文件


现在在我的代码中,我用
Await.result
阻塞,这仅仅意味着线程正在休眠…

一个简单的肮脏技巧:

假设你有:

def f1Sync: T1
def f2Sync: T2
...
def fAsynchronous: Future[TAsync]


import scala.concurrent.{ Future, Promise }


object FutureHelper {
  // A value class is much cheaper than an implicit conversion.
  implicit class FutureConverter[T](val t: T) extends AnyVal {
    def future: Future[T] = Promise.successful(t).future
  }

}
然后您可以
获得收益率

import FutureHelper._

def completeChain: Future[Whatever] = {
  for {
    r1 <- f1Sync.future
    r2 <- f2Sync.future
    .. all your syncs
    rn <- fAsynchronous // this should also return a future
    rnn <- f50Sync(rn).future// you can even pass the result of the async to the next function
  } yield rn  
}
导入FutureHelper_
def completeChain:未来[无论什么]={
为了{

r1您也可以使用async/await库,但需要注意的是,您最终会遇到一个仍然需要处理的巨大未来:

但是,它会产生与同步代码几乎相同的代码;在先前阻塞的地方,您添加了一个:

await { theAsyncFuture } 

然后继续使用同步代码。

您想对异步调用的结果做什么?谢谢您的提问。检查其值以进行下游处理,而不是火灾和伪造。我假设您指的是实现。虽然我现在已经习惯了映射未来,但在弄清楚它如何分配线程。