【发布时间】:2021-09-28 06:48:08
【问题描述】:
我有两个具有以下签名的函数:
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)))
}
}
}
【问题讨论】:
-
你能用
Future<Void, Error>代替吗?这将使生活更轻松。 -
遵循此处的建议:stackoverflow.com/questions/69311371/… 随意重新设计 API 以改用
Future<Void, Error>。我对一般概念而不是特定的函数签名更感兴趣。我添加了一些细节来阐明总体思路以及我的出发点。 -
你的问题基本上是this,但是
Future<Result<Void, Error>, Never>。通过使用这种可怕的类型,您需要编写自己的专用append运算符,如果结果为failure,则该运算符不会附加。我的建议是,停止使用Future<Result<Void, Error>, Never>,并使用 LuLuGaGa 上一篇文章中的答案(但使用Future扩展名而不是CurrentValueSubject)。这样你就可以使用内置的append。 -
是的,好主意。可怕的类型虽然看起来很擅长呼叫站点,但会导致太多问题。
标签: swift promise functional-programming combine