Scala:拦截函数,用于为Akka Futures提供隐式参数

时间:2012-08-13 19:53:52

标签: scala akka implicit-conversion future implicit-parameters

好的,所以我对返回Akka Futures的函数进行了一系列调用,并且我通过使用flatMap和map来链接它们:

doAsyncCall(..).flatMap { res1 =>
  doAsyncCall2(..).flatMap { res2 =>
    doAsyncCall3(..).map { res3 =>
      res
    }
  }
}

可以分散在不同的函数调用中。现在每个doAsyncCallX调用返回一个Future [Result],我希望能够组合这些结果,将它们传递到链上,直到最后我可以返回链中所有结果的组合结果。

为此,我想让每个doAsyncCallX接收前一个结果的隐式参数,并将获得的结果与前一个结果相结合。问题是,我没有看到这样做的方法,而不会乱丢我的库的使用与这样的隐式val:

doAsyncCall(..).flatMap { res1 =>
  implicit val implicitRes1 = res1
  doAsyncCall2(..).flatMap { res2 =>
    implicit val implicitRes2 = res2
    doAsyncCall3(..).map { res3 =>
      res
    }
  }
}

我想要做的是能够拦截flatMap的应用程序,以确保先前的响应作为下一个doAsyncCallX调用的隐式参数正确传递。关于如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:2)

也许我错过了一些东西,但根本没有理由使用含义吗?

for(res1 <- doAsyncCall1(..);
    res2 <- doAsyncCall2(res1);
    res3 <- doAsyncCall3(res2)) yield(res3)

如果您需要返回组成多个中间结果的结果,请更改yield以产生不同的结果,可能是一个元组,如yield((res1,res2,res3))。其结果类似于Future[(Result1,Result2,Result3)]