多次调用 yield

Multiple calls in for yield

我不明白如何在 for comprehension 中的每个元素上调用我的函数 doSomething() 并由于这里的 .map 而使用 futures 进行管理。

我不确定这样做的好方法是什么。是不是 for comprehensiondoSomething() 一起使用?

def myFunc(tion(ids: List[Ids]): Future[MyBean] = {
  for {
    first <- ids.map{ id =>
      myDAO.doSomething(id)
    }
    second <- myDAO.doSomehtingElse(ids)
  } yield {
    MyBean(first, second)
  }
}

def doSomething(id: Id): Future[Long] = Future {...}
def doSomethingElse(ids: List[Id]): Future[Long] = Future {...}

这一行之后:

  ids.map{ id =>
      myDAO.doSomething(id)
    }

您将获得期货清单List[Future[A]]。为了能够将其与另一个 future 进行 flatMap,您需要将其转换为 Future[List[A]]。为此,您可以使用 Future.sequence。此外,您可以使用 Future.traverse:

Future.traverse(ids)(myDao.doSomething)

在这种情况下,您可以避免使用map

最后可以按如下方式进行:

  for {
    first <- Future.sequence(ids.map(id => myDAO.doSomething(id)))
    second <- myDAO.doSomehtingElse(ids)
  } yield {
    MyBean(first, second)
  }

或者:

      for {
        first <- Future.traverse(ids)(myDAO.doSomething)
        second <- myDAO.doSomehtingElse(ids)
      } yield {
        MyBean(first, second)
  }

此外,请记住 myDAO.doSomehtingElse 将按顺序调用 - 而不是并行调用。