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 // <—

现在,catchMaptransform 方法正在接收 Future&lt;Future&lt;Response&gt;&gt;,因为 map 只转换给定未来的封装数据,如下所示:

Future<String> -map(String -> Future<Response)-> Future<Future<Response>>

使用flatMap,它将展平双Future,这就是该方法的目的,导致:

Future<String> -flatMap(String -> Future<Response)-> Future<Response>

然后,catchMap 将能够访问错误。

【讨论】:

以上是关于Swift Vapor:不等待 catchMap的主要内容,如果未能解决你的问题,请参考以下文章

swift [Vapor 3.0模型模板] #vapor3

Vapor 3 Swift 4 如何制作计时器

Vapor 不适用于 xcode 9 和 swift 4

在纯 Swift (Vapor) 项目中拥有 HMAC SHA256

Swift 3 如何使用 Vapor 发送多部分发布请求

无法使用 Vapor 将 swift 包推送到 Heroku