Success vs Success

这是在学习的代码中遇到的一个问题

这里的Success 是在路由中对 Future 用了onComplete
源码如下:
这是Akka HTTP里的一个directive,用来处理Future的
这里的Success 是对 Try[T]的一种情况

def onComplete[T](future: ⇒ Future[T]): Directive1[Try[T]] =
Directive { inner ⇒ ctx ⇒
import ctx.executionContext
future.fast.transformWith(t ⇒ inner(Tuple1(t))(ctx))
}

def staticRoute: Route =
get {
// static route
(pathSuffix(publicPath) & extractUri & headerValueByName("Accept")) {
(_, uri, accept) =>

val filePath = s"$staticFolder${uri.path.toString}"
val readFuture = readFromPath(filePath)

val tp = accept.split(',').head

onComplete(readFuture) {
case Success(content) =>
// complete(HttpEntity( content))
complete(HttpEntity.Strict(ContentType.parse(s"$tp;charset=UTF-8").right.get, ByteString(content)))

case Failure(e) =>
complete(NotFound, HttpEntity(ContentTypes.`text/html(UTF-8)`, "<h1>Not Found</h1>"))
}
}
}

问题来了

我之前在这个路由前面

import StatusCodes._

因为其他路由会用到NotFound这个种status code,我就全引入了,但是我没有注意到这里也有一个Success 的status code
所以compile的时候就报错说混淆了,但我找了半天都没找到哪里引入了另外的Success
直到我注释了

import scala.util.{Failure, Success}

才看到明确的错误提示,指向了StatusCodes里面

同样的问题很多

和这个问题一样,另一个东西这里面我也被混淆了
onComplete
这个名字一看就是处理Future的
但是如果是
这个就是上面那个AKKA HTTP里的directive 只能在路由里用的 HTTP层的玩意

onComplete(future:Future[T]){
case Success(value)=>xxx
case Falure(e)=>xxx
}

而我们平时用的处理普通Future的要这么写

val future :Future[T]
future.onComplete{
case Success(v)=>
case Failure(e)=>
}

写法不同哦,要不类型会无法匹配的,很容易就混淆了