热门IT资讯网

Scala flatMap的变体

发表于:2024-11-28 作者:热门IT资讯网编辑
编辑最后更新 2024年11月28日,今天看到了flatMap的变体flatMapMflatMapM {_.map(getUserWithKey).getOrElse(Future.failed(UnavailableUserKey))…

今天看到了flatMap的变体flatMapM

flatMapM {

_.map(getUserWithKey).getOrElse(Future.failed(UnavailableUserKey))……


点进去后看发现:

/**
* Like flatMap but allows the flatMap function to execute asynchronously.
*
* @param f the async function to produce a new body parser from the result of this body parser
* @param ec The context to execute the supplied function with.
* The context is prepared on the calling thread.
* @return the transformed body parser
* @see [[flatMap]]
* @see [[play.api.libs.iteratee.Iteratee#flatMapM]]
*/
def flatMapM[B](f: A => Future[BodyParser[B]])(implicit ec: ExecutionContext): BodyParser[B] = {
// prepare execution context as body parser object may cross thread boundary
implicit val pec = ec.prepare()
new BodyParser[B] {
def apply(request: RequestHeader) = self(request).flatMapM {
case Right(a) =>
f(a).map { _.apply(request) }(pec)
case left =>
Future.successful {
Done[Array[Byte], Either[Result, B]](left.asInstanceOf[Either[Result, B]])
}
}(pec)
override def toString = self.toString
}
}


0