【发布时间】:2021-06-16 18:23:54
【问题描述】:
我有一组 Observable,比如 [Observable <WriteTaskResult>]
我想执行所有写任务保持它们的顺序,如果其中任何一个失败,那么我想执行Observable<ResetTaskResult>
以下函数将返回 BatchTasksResult 类型的 observable 用于跟踪任务进度。
示例代码:
enum BatchTasksResult{
case elapsedTime(Double)
case failedFatal
case rolledback
case success
}
func writeBlocks(tasks: [WriteTask]) -> Observable<BatchTasksResult>{
return Observable.create {(observable) -> Disposable in
let allTasks: [Observable<WriteTaskResult>] = self.writeSomewhere(tasks)
Observable.concat(allTasks)
.subscribe { writeTaskResult in
observable.onNext(.elapsedTime(writeTaskResult.totalTime))
}
onError: { (err) in
// Perform Observable<ResetTaskResult>
// if ResetTask was successful then observable.onNext(.rolledback)
// if ResetTask failed then observable.onNext(.failedFatal)
}
onCompleted: {
observable.onNext(.success)
}
.disposed(by: disposeBag)
return Disposables.create()
}
}
如何使用来自 allTasks 的 observable 的 onError 的 Observable 触发回滚逻辑?
简单的解决方案似乎嵌套了 observable,但我猜这不是一个好习惯?我尝试了 FlatMap,但它并不能真正解决 “如果任何单个任务失败,则回滚并重置”还有其他解决方案吗?
【问题讨论】:
标签: ios swift xcode reactive-programming rx-swift