首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并: AnyPublisher<Response,Error> to AnyPublisher<Response,Never>

合并: AnyPublisher<Response,Error> to AnyPublisher<Response,Never>
EN

Stack Overflow用户
提问于 2020-12-07 05:12:22
回答 1查看 1.2K关注 0票数 2

我有一种特殊的情况,返回函数提供类似于AnyPublisher<Response, Error>的东西。但是从调用函数中,我想返回AnyPublisher<Response, Never>

代码语言:javascript
复制
//just an example
func getList(_ request: QueryRequest) -> AnyPublisher<Response, Never> {
   return executeQuery(request).eraseToAnyPublisher()
}

func executeQuery(_ request: QueryRequest) -> AnyPublisher<Response, Error> {
   return someData().eraseToAnyPublisher()
}

当我这么做的时候,我得到了Cannot convert return expression of type 'AnyPublisher<Response, Error>' to return type 'AnyPublisher<Response, Never>'

如何在不修改被调用的函数的情况下转换为AnyPublisher<Response, Never>

注意:我不能修改被调用函数的返回类型,因为其他利用错误的方法使用它

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-07 06:00:48

要从可能失败的上游发布服务器转换为从不失败的发布服务器,您需要决定如何处理发生错误的情况(因为它不能发送到下游)。

如果您“知道”在特定情况下永远不会发生这种情况,则可以断言不会出现错误:

代码语言:javascript
复制
return executeQuery(request)
          .assertNoFailure("this shouldn't have happened")
          .eraseToAnyPublisher()

或者您可以忽略它(通过捕获它并用Empty发布服务器替换它),这将完成您的管道:

代码语言:javascript
复制
return executeQuery(request)
          .catch { _ in Empty<Response, Never>() }
          .eraseToAnyPublisher()

您还可以用.replaceError(with:)替换错误值。

请注意,当executeQuery发布服务器(上游)出现错误时,它将完成管道,因此下游也将收到一个完成。

您不能像您在评论中所问的那样,继续从错误的上游接收值。如果您认为错误是暂时的(例如,无法访问服务器),则可以考虑重新订阅.retry

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65176436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档