0

好的,所以我对返回 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 调用的隐式参数正确传递。关于如何做到这一点的任何想法?

4

1 回答 1

2

Perhaps I'm missing something, but is there a reason to use implicits at all?

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

If you need to return a result composing multiple of the intermediate results, change the yield to yield something different, perhaps a tuple, like yield((res1,res2,res3)). The result of which would be something like Future[(Result1,Result2,Result3)]

于 2012-08-14T01:02:10.420 回答