SwiftNIO和Vapor中的链式抛出期货

问题描述 投票:1回答:1

在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")

        }

    }

在获得API结果后,我似乎无法在链接的try中使用map()。如果我在地图内的!中的try中添加了let response = try response.content.decode(ResponseModel.self),则上面的代码将起作用,但理想情况下,我想捕获此错误。创建响应正文时使用的第一个try似乎是隐式地传递回了链,但不是第二个。

我做错了什么?解码响应内容时如何捕获错误?为什么捕获到第一个try而不捕获第二个?

swift xcode vapor swift5.2 swift-nio
1个回答
0
投票

map的属性是它将仅转换“成功路径”上的值。但是,您的转换可能会失败,这意味着您大概也希望未来也会失败。

无论何时要使用成功或失败的函数转换值,都需要使用flatMap*函数之一。

根据您的情况,尝试将map替换为flatMapThrowing,然后它应该可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.