我有一个从数据库检索数据并返回Future [ResponseDTO]类型的函数,然后我需要将其转换为HttpResponse的Future
我的代码:
val responseDTO = database.getResponseDto(service) => Future[ResponseDTO]
responseDTO.onComplete {
case Success(responseDTO) => HttpResponse(status = responseDTO.responseCode, entity = responseDTO.responsePayload)
case Failure(exception) => HttpError("error")
}
它不会工作
也尝试过这一点,仍然无法正常工作
responseDTO.map(
dto => EitherT.pure[Future, HttpError](HttpResponse(status = dto.responseCode, entity = dto.responsePayload))
)
答案 0 :(得分:5)
使用t = df['Target'].values[:, None]
v = df['Value'].values
m = v > t
m[np.tril_indices(m.shape[1])] = False
print (m)
[[False False False False True True False False False True]
[False False False False True True False False False True]
[False False False True True True False False True True]
[False False False False True False False False False True]
[False False False False False False False False False False]
[False False False False False False False False True True]
[False False False False False False False False False True]
[False False False False False False False False True True]
[False False False False False False False False False True]
[False False False False False False False False False False]]
a = np.argmax(m, axis=1) - np.arange(len(df))
print (a)
[ 4 3 1 1 -4 3 3 1 1 -9]
df['new'] = np.where(a > 0, a, 0)
print (df)
Value Target new
0 8 12 4
1 9 12 3
2 10 11 1
3 12 15 1
4 16 19 0
5 13 11 3
6 11 16 3
7 7 11 1
8 12 17 1
9 18 18 0
应该给出您想要的答案:
transform
这将返回成功的responseDTO.transform {
case Success(responseDTO) => Success(HttpResponse(status = responseDTO.responseCode, entity = responseDTO.responsePayload))
case _ => Success(HttpError("error"))
}
,其结果类型与Future
和HttpResponse
兼容。
如果要保留有关成功/失败的信息,最好使用HttpError
的状态来完成。在这种情况下,您的代码将使用Future
的替代版本,如下所示:
transform
然后,您可以在其余代码中使用case class HttpErrorException(err: HttpError) extends Throwable
responseDTO.transform(
responseDTO => HttpResponse(status = responseDTO.responseCode, entity = responseDTO.responsePayload),
_ => HttpErrorException(HttpError("error"))
)
方法来提取Future
或HttpResponse
。
答案 1 :(得分:3)
您想描绘未来。 .onComplete
方法不会改变未来,只是增加一个处理程序(对副作用有用)
responseDTO.map(dto => HttpResponse(status=dto.responseCode, entity=dto.responsePayload))
答案 2 :(得分:3)
您需要使用.map
来映射成功的将来计算,使用.recover
来映射将来的计算期间的异常,并使用Either
来获得成功/失败的结果。
val responseDTO: Future[ResponseDTO] = ...
val future: Future[Either[HttpError, HttpResponse]] =
responseDTO
.map(d => Right(HttpResponse(status = d.responseCode, entity = d.responsePayload)))
.recover {
case t: Throwable => Left(HttpError("error"))
}
如果您的类只有一个超类,那么说:
trait Http
case class HttpResponse(...) extends Http
case class HttpError(...) extends Http
您可以避免使用Either
:
val future: Future[Http] =
responseDTO
.map(d => HttpResponse(status = d.responseCode, entity = d.responsePayload))
.recover {
case t: Throwable => HttpError("error")
}
答案 3 :(得分:-1)
您需要做的是将以前的A类型的未来映射到B类型的新未来,future的onComplete方法会产生副作用,并且仅有助于将回调附加到结果上,并且其方法签名返回Unit。 / p>