今天看到了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 }}