swift - 在 Swift / Combine 中依次执行两个 Promise
问题描述
我有两个具有以下签名的函数:
import Combine
func firstCall() -> Future<Result<Void, Error>, Never> {
return Future { promise in
promise(.success(.success(())))
}
}
func secondCall() -> Future<Result<Void, Error>, Never> {
return Future { promise in
promise(.success(.success(())))
}
}
// Execute 1st call, then if it succeeds, execute the 2nd call
只有在第一个功能成功完成后,我如何才能执行第二个功能?
理想情况下,我正在寻找这样的东西:
executeInSequence([firstCall(), secondCall()])
.onResult( { finalResult in
print(finalResult)
})
如果这有助于调用站点,请随意稍微调整 API 签名。
更多信息:其中一个调用实际上是转换后的同步方法调用,其签名为:
func secondSynchronousCall() throws {
}
private func secondCall() -> Future<Result<Void, Error>, Never> {
return Future { [weak self] promise in
do {
try self?.secondSynchronousCall()
promise(.success(.success(())))
} catch {
promise(.success(.failure(error)))
}
}
}
解决方案
在 Combine 中,Futures 只是专门的出版商。鉴于您与出版商打交道,您将执行以下操作:
let cancellable = firstCall()
.tryMap { result in
try result.get()
}
.flatMap { _ in
secondCall()
}
.tryMap { result in
try result.get()
}
.sink { completion in
print(completion)
} receiveValue: { _ in
print("reveiveValue")
}
您可以更简洁地编写它,但是,我建议首先简化您的输出和错误类型,正如评论中已经指出的那样:
例如:
func firstCall2() -> Future<Void, Error> {
return Future { promise in
promise(.success(()))
//promise(.failure(MyError()))
}
}
func secondCall2() -> Future<Void, Error> {
return Future { promise in
promise(.success(()))
}
}
接着:
let cancellable2 = firstCall2()
.map(secondCall2)
.sink { completion in
print(completion)
} receiveValue: { _ in
print("reveiveValue")
}
推荐阅读
- python - 终端在 VS Code 中仅显示一个空的不可编辑光标
- android - 允许 TextView 增长到约束布局中的某个点
- amazon-web-services - 在 Classic Load Balancer AWS 上将 HTTP 重定向到 HTTPS
- c# - 使用 Azure Blob 存储中的 .Net Core API 异步流式传输视频
- c# - 如何在 WPF 中禁用 LWin 和箭头快捷方式?
- java - 在执行 Spring boot Junit 类之前只运行一次 sql 脚本
- opengl - 添加> = 2 ^ 16个数字时的OpenGL缓冲区问题
- asynchronous - Python:只运行一个函数异步
- c# - double field = null 而它确实不应该是
- c# - JsonValue 和 JsonObject 有什么区别?