Фьючерсы на цепочку в SwiftNIO & Vapor - PullRequest
1 голос
/ 07 марта 2020

В Vapor 4 я обрабатываю пост-запрос, вызывая запрос к стороннему API и возвращая значение, основанное на результате, который я получаю. Следующий код приводит к ошибке: «Неправильное преобразование из функции броска ... в функцию не бросания»

 app.post("activate") { req -> EventLoopFuture<ActivationRequestResponse> in

        return req.client.post("https://api.example.com/activation", headers: HTTPHeaders(), beforeSend: { (req) in
            try req.content.encode(RequestBody(value: someValue), as: .json)
        })

        .map { (response) -> ActivationRequestResponse in

            let response = try response.content.decode(ResponseModel.self)
            return ActivationRequestResponse(success: true, message: "success")

        }

    }

Я не могу использовать try в цепочке map() после получения результат API. Приведенный выше код будет работать, если я добавлю ! к try in let response = try response.content.decode(ResponseModel.self) внутри карты, но в идеале я хочу уловить эту ошибку. Первый try, используемый при создании тела ответа, кажется, неявно передается обратно по цепочке, но не второй.

Что я делаю не так? Как отловить ошибку при декодировании содержимого ответа? Почему первый try пойман, а не второй?

1 Ответ

2 голосов
/ 07 марта 2020

Свойство map заключается в том, что оно просто преобразует значение в «путь успеха». Однако ваше преобразование может завершиться неудачно, что означает, что вы, вероятно, хотите, чтобы и будущее не удавалось.

Когда вы хотите преобразовать значение с помощью функции, которая либо успешно выполняется, либо не срабатывает, вам необходимо использовать одну из функций flatMap*.

В вашем случае попробуйте заменить map на flatMapThrowing, и тогда оно должно работать.

...