Swift Vapor:不等待 catchMap
Posted
技术标签:
【中文标题】Swift Vapor:不等待 catchMap【英文标题】:Swift Vapor: catchMap not being awaited 【发布时间】:2019-06-09 01:22:35 【问题描述】:我在控制器中有以下代码部分,它查询 MailGun 以发送电子邮件,然后理想情况下应该在控制器返回之前等待响应。按照现在的配置,这应该会失败,因为我故意破坏了我的 MailGun 配置。但是目前控制器正在返回成功状态,因为没有正确等待.catchMap
功能,而且我不确定如何正确地构造我的代码以便它是。
return emailTemplate.render(emailData, on: req).map message -> Future<Response> in
let deliveryService = try req.make(EmailDeliveryService.self)
return try deliveryService.send(message, on: req)
.catchMap error in
/// this is not being awaited, and no abort is thrown before the request returns
throw Abort(.internalServerError, reason: "Error sending email.")
.transform(to: savedObj)
应该正确等待的函数deliverService.send
具有方法签名:
func send(_ message: EmailMessage, on container: Container) throws -> Future<Response>
如何适当地构造此代码以正确捕获deliveryService.send
方法的结果返回的错误?
【问题讨论】:
【参考方案1】:如果您的 render()
方法签名是这样的:
func render(…) -> Future<String>
那么,我认为您需要在中使用flatMap
而不是map
:
return emailTemplate.render(emailData, on: req).map // <—
现在,catchMap
和 transform
方法正在接收 Future<Future<Response>>
,因为 map
只转换给定未来的封装数据,如下所示:
Future<String> -map(String -> Future<Response)-> Future<Future<Response>>
使用flatMap
,它将展平双Future,这就是该方法的目的,导致:
Future<String> -flatMap(String -> Future<Response)-> Future<Response>
然后,catchMap
将能够访问错误。
【讨论】:
以上是关于Swift Vapor:不等待 catchMap的主要内容,如果未能解决你的问题,请参考以下文章