将 Just 与 flatMap 一起使用会产生失败不匹配。结合
Using Just with flatMap produce Failure mismatch. Combine
我有这样的代码
func request(request: URLRequest) -> AnyPublisher<Data, Error> {
return Just(request)
.flatMap { request in
RequestManager.request(request) // returns AnyPublisher<Data, Error>
}
.eraseToAnyPublisher()
}
我遇到编译错误:
Instance method flatMap(maxPublishers:_:) requires the types
Just.Failure (aka Never) and Error be equivalent
很明显,因为 Just
有 Never
作为 Failure
而 .flatMap
需要 Error
作为 Failure
,所以 Never
!= Error
我看到两种方法:
使用 right Publisher,而不是 Just
,但我没有找到合适的人选。
使用 .mapError
、.mapError { [=23=] as Error }
等运算符,但我不确定这是不是个好主意。
有什么处理方法吗?
更新:
使用
更有意义
.setFailureType(to: Error.self)
或
.mapError { [=12=] as Error }
如果您在 Just 输出上调用 .mapError()
,它会将类型更改为包含 Error
,但永远不会调用该闭包(所以我不担心)——这就是除非有人有更好的主意,否则我会做。
通常,flatMap 上的 Self.Error == P.Error
是有意义的,因为你不能忽略来自 Self 的错误。但是,当 Self.Error
为 Never
时,您可以忽略它们并产生您自己的错误。
有特殊运算符setFailureType(to:)
。您可以将故障类型覆盖为您需要的任何错误类型。
func request(request: URLRequest) -> AnyPublisher<Data, Error> {
return Just(request)
.setFailureType(to: Error.self)
.flatMap { request in
RequestManager.request(request) // returns AnyPublisher<Data, Error>
}
.eraseToAnyPublisher()
}
https://developer.apple.com/documentation/combine/just/3343941-setfailuretype
虽然接受的答案确实有效,但它非常冗长。我偶然发现了一种使用 Result<Success,Failure).publisher 的替代语法,它更简洁:
Result.Publisher(.success(request))
(请注意,在这种情况下,我依赖 Swift 来推断错误类型,但您可能需要明确声明它:Result<URLRequest, Error>.Publisher(.success(request))
)
我有这样的代码
func request(request: URLRequest) -> AnyPublisher<Data, Error> {
return Just(request)
.flatMap { request in
RequestManager.request(request) // returns AnyPublisher<Data, Error>
}
.eraseToAnyPublisher()
}
我遇到编译错误:
Instance method flatMap(maxPublishers:_:) requires the types Just.Failure (aka Never) and Error be equivalent
很明显,因为 Just
有 Never
作为 Failure
而 .flatMap
需要 Error
作为 Failure
,所以 Never
!= Error
我看到两种方法:
使用 right Publisher,而不是
Just
,但我没有找到合适的人选。使用
.mapError
、.mapError { [=23=] as Error }
等运算符,但我不确定这是不是个好主意。
有什么处理方法吗?
更新:
使用
更有意义.setFailureType(to: Error.self)
或
.mapError { [=12=] as Error }
如果您在 Just 输出上调用 .mapError()
,它会将类型更改为包含 Error
,但永远不会调用该闭包(所以我不担心)——这就是除非有人有更好的主意,否则我会做。
通常,flatMap 上的 Self.Error == P.Error
是有意义的,因为你不能忽略来自 Self 的错误。但是,当 Self.Error
为 Never
时,您可以忽略它们并产生您自己的错误。
有特殊运算符setFailureType(to:)
。您可以将故障类型覆盖为您需要的任何错误类型。
func request(request: URLRequest) -> AnyPublisher<Data, Error> {
return Just(request)
.setFailureType(to: Error.self)
.flatMap { request in
RequestManager.request(request) // returns AnyPublisher<Data, Error>
}
.eraseToAnyPublisher()
}
https://developer.apple.com/documentation/combine/just/3343941-setfailuretype
虽然接受的答案确实有效,但它非常冗长。我偶然发现了一种使用 Result<Success,Failure).publisher 的替代语法,它更简洁:
Result.Publisher(.success(request))
(请注意,在这种情况下,我依赖 Swift 来推断错误类型,但您可能需要明确声明它:Result<URLRequest, Error>.Publisher(.success(request))
)