Future 是 Promise 的一个简化版本,用 Swift 编写。它的目标是为用户提供以下功能:
当调用返回 Future 的方法时:
doAsyncThing().then { result in
// do something with result
}
在这里,Result 将是非可选的,并且只有在 Future 成功完成时才会调用 then
块。
错误处理的实现方式类似:
doAsyncThingThatErrors().catch { error in
// do something with error
}
这里的错误也是非可选的,并且是 Future 本身定义的类型(而不是未类型化的 throws
调用)。
Futures 严重依赖泛型来提供类型安全。
func doAsyncThing() -> Future<Int, MyError> {
}
Future<> 定义的第一个值表示 Future 成功时期望的类型,第二个值表示 Future 失败时期望的类型。错误类型必须符合 Swift 的 Error
类型。
Future 的初始化器的目标是保持类型安全,但尽可能消除繁琐的类型注释。
func doAsyncThing() -> Future<Int, MyError> {
return Future { resolver in
// ...
}
}
传入块中的 resolver
值是一个 Result.Resolver,它有两个方法:
resolver.resolve(value:)
和
resolver.reject(error:)
它们将分别正确地解析或拒绝相关的 Future。
Futures
命名空间上存在一些组合 Futures 的方法。它们是:
Futures.all()
如果且仅当所有传递的 Futures 都成功完成时,它将返回一个使用 Results 集合解析的 Future。
Futures.any()
如果一个或多个传递的 Futures 成功完成,它将返回一个使用 Results 集合解析的 Future。
Futures.first()
它将返回一个 Future,该 Future 将使用第一个完成的 Future 的值解析或拒绝。
目前,尝试 Futures 的首选方式是通过 Swift Package Manager。
.package(url: "https://github.com/genius/future", from: "0.0.1")
如果无法通过 Swift Package Manager 安装,您也可以从您自己的项目的 Sources
目录中复制 Future.swift
文件。
欢迎提交错误报告、建设性反馈和 pull requests。如果您在自己的应用程序中使用 Futures,我们很乐意了解它。