SwiftPromises
Swift 的轻量级 Promise 包
概览
SwiftPromises
是一个轻量级包,用于在原生 Swift 中实现 Promise。它没有任何子依赖,旨在用最少的代码增加 Promise 支持。
Promise 是一个表示异步操作最终完成/失败的对象。虽然它在某些语言中是原生支持的,但 Swift 目前还没有原生支持。
受 Pierre Felgines 的文章 "Implementing Promises in Swift"、Khanlou 的 Promise 库 和 Google 的 Promises 框架 启发。
安装
SwiftPromises
通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
pod 'SwiftPromises'
然后运行 pod install
。
使用示例
创建Promise
以下代码定义了一个Promise,它将会解析为值15
。
let promise = Promise<Int> (15)
...
let promise = Promise<Int> {
return 15
}
...
let promise = Promise<Int> { resolve, _ in
resolve(15)
}
Promise也可以通过Error
对象进行拒绝。
let error = NSError(domain: "Error", code: -500, userInfo: [:])
let promise = Promise<Int> (error)
...
let promise = Promise<Int> {
return error
}
...
let promise = Promise<Int> { _, reject in
reject(error)
}
Then
Then
函数可以用来处理已解析的Promise。
let promise = Promise<Int> { resolve, _ in
resolve(1)
}
promise.then { (num) in
print(num) // Prints 1
}
Catch
Catch
函数可以用来处理Promise中的异常。
let promise = Promise<Bool> { _, reject in
reject(NSError(domain: "Error", code: -500, userInfo: [:]))
}
promise.catch { err in
let err = err as NSError
let message = err.domain
print(message) // Prints "Error"
}
链式调用
Promise可以被链式调用。
func work1(_ string: String) -> Promise<String> {
return Promise { resolve, _ in
resolve(string)
}
}
func work2(_ string: String) -> Promise<Int> {
return Promise { resolve, _ in
resolve(Int(string) ?? 0)
}
}
func work3(_ number: Int) -> Int {
return number * number
}
work1("10").then { string in
return work2(string)
}.then { number in
return work3(number)
}.then { number in
print(number) // Prints 100
}
All
可以使用All
函数并行调用Promise数组。All
返回一个新的Promise,该Promise返回一个包含解析值的数组。如果数组中的某个Promise抛出错误,All
将调用其Catch
函数。
let promise = Promise<Int> { resolve, _ in
resolve(15)
}
let promise2 = Promise<Int> { resolve, _ in
resolve(4)
}
all([promise, promise2]).then { (numbers) in
var total = 0
for number in numbers {
total += number
}
print(total) // Prints 19
}.catch { (err) in
// Not called in this example
}
等待
等待
函数可以用来同步调用Promise。
let promise = Promise<Int> { resolve, _ in
DispatchQueue.global().asyncAfter(deadline: .now() + 1, execute: {
resolve(1)
})
}
guard let value = try? await(promise: promise) else { return }
print(value) // Prints 1 after one second has passed
请注意,等待
函数应当仅在全局线程中调用,以防止死锁。
贡献
我们欢迎为SwiftPromises
做出贡献的开发者。在开始之前,请查阅我们的贡献指南。
作者
WyattMufson - Ryu Games联合创始人
许可
SwiftPromises
在MIT许可下可用。