Swift Vapor: catchMap не ожидается - PullRequest
0 голосов
/ 09 июня 2019

У меня есть следующий раздел кода в контроллере, который запрашивает 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 Ответ

0 голосов
/ 24 июня 2019

Если ваша 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<String> -flatMap(String -> Future<Response)-> Future<Response>

Затем catchMap сможет получить доступ к ошибке.

...