Future (未来)

Future 是 Promise 的一个简化版本,用 Swift 编写。它的目标是为用户提供以下功能:

  1. 清晰地分离成功和错误处理程序,完成块中没有可选值。
  2. 类型安全的错误处理
  3. 一个易于使用的调用点,能够更好地匹配我们描述代码的方式。

简单用法

当调用返回 Future 的方法时:

doAsyncThing().then { result in 
	// do something with result
}

在这里,Result 将是非可选的,并且只有在 Future 成功完成时才会调用 then 块。

错误处理的实现方式类似:

doAsyncThingThatErrors().catch { error in 
	// do something with error
}

这里的错误也是非可选的,并且是 Future 本身定义的类型(而不是未类型化的 throws 调用)。

返回 Future

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 的方法。它们是:

Futures.all()

如果且仅当所有传递的 Futures 都成功完成时,它将返回一个使用 Results 集合解析的 Future。

Futures.any()

如果一个或多个传递的 Futures 成功完成,它将返回一个使用 Results 集合解析的 Future。

Futures.first()

它将返回一个 Future,该 Future 将使用第一个完成的 Future 的值解析或拒绝。

安装

SwiftPM

目前,尝试 Futures 的首选方式是通过 Swift Package Manager。

.package(url: "https://github.com/genius/future", from: "0.0.1")

手动

如果无法通过 Swift Package Manager 安装,您也可以从您自己的项目的 Sources 目录中复制 Future.swift 文件。

贡献

欢迎提交错误报告、建设性反馈和 pull requests。如果您在自己的应用程序中使用 Futures,我们很乐意了解它。