今天看到了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
}
}
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。