【发布时间】:2020-07-02 09:52:22
【问题描述】:
所以,据我所知,在 Alamofire 和 Combine 上,我们现在可以做到这一点:
AF.request(...).publishDecodable(type: DecodableType.self)
如果我们想将错误映射到 AFError 以外的自定义类型,这意味着我们最终会得到这样的方法:
enum DifferentError: Error {
case alamofire(wrapped: AFError)
case malformedURL
func requestSomeStuff(url: String) -> AnyPublisher<DecodableType, DifferentError> {
guard self.validateUrl(url) else {
return Fail(error: DifferentError.malformedURL).eraseToAnyPublisher()
}
return AF.request(...)
.publishDecodable(type: DecodableType.self)
.value()
.mapError { DifferentError.alamofire(wrapped: $0) }
.eraseToAnyPublisher()
}
Fail 发布者对我来说似乎不对;我在这里遗漏了什么,或者这是正确的做法吗?
这应该返回一个Future 吗?可以将publishDecodable 映射到Future 吗?
【问题讨论】:
-
为什么你觉得它必须是
Future?Future实际上只是一个包装发布者,它围绕着未来可能通过异步操作产生的一些价值。在这里,如果someKindOfValidation是同步的,那么Fail会立即向下游返回失败,而不是AF 发布者链。取决于你说“做错误映射”时想要实现的目标 -
更新了问题以阐明“做错误映射”部分。认为它应该是
Future,因为它应该产生一个值或失败,并且它可能会因.fail(Error)而不是Fail发布者而失败。不过,这可能完全不是问题! -
什么是
.fail?你的意思是.failure(error)承诺Future?它实际上会达到相同的效果。调用者不知道也不关心这是什么发布者 - 就它而言,它是AnyPublisher,Future和Fail都达到了相同的结果。 -
是的,我的意思是
.failure,抱歉。好吧,如果该方法返回Future<DecodableType, DifferentError>,调用者就会知道并关心该方法只能发布一个值。需要明确的是,这里的意图不是将Fail变成Future的承诺.failure(Error),而是让整个方法返回Future,同时仍然使用来自 Alamofire 的publishDecodable。跨度> -
你可以返回一个
Future,当然——但目前——通常从我所见——你的API边界被定义为AnyPublisher。换句话说,除了输出和失败类型之外,订阅者不应该关心他们订阅的发布者。还有一个需求的概念,订阅者只能要求一个值。