这是一个轻量级且简单的 Swift Promise 实现。
基本用法
let promise = Promise<Int, Never> { resolve, reject in
resolve(10)
}
promise
.map{ $0 * 10 }
.sink{ print($0) } // 100
let imageData = URLSession.shared.data(for: URL(string: "https://example.com/image.png))
imageData
.sink{ print($0) }
支持 Async/Await。
let dataPromsie = Promise<Int, Never> { resolve, reject in
// download data
}
asyncHandler { await in
let data = await | dataPromsie
let image = await | UIImage.async(data: data)
print(image.size)
}
map
使用闭包转换 Output。
flatMap
与闭包返回的 Promise 链接。
tryMap
执行一个抛出异常 (throws) 的闭包,如果失败,则将后续的 Promise 设置为失败。
tryFlatMap
执行一个抛出异常 (throws) 的闭包,如果失败,则将后续的 Promise 设置为失败。
mapError
使用闭包转换 Failure。
replaceError
用参数中的 Output 替换 Failure。
eraseToError
将 Failure 的类型转换为 Error。
eraseToVoid
将 Output 的类型转换为 Void。
peek
当为 Output 时,执行闭包。 之后可以连接操作符。
peekError
当为 Failure 时,执行闭包。 之后可以连接操作符。
sink
当为 Output 时,执行闭包。 之后无法连接操作符。
catch
当为 Failure 时,执行闭包。 之后无法连接操作符。
let dataPromise: Promise<Data, Error> = ...
dataPromise
.map{
// 値の変換
}
.peek{
// アクションの実行
}
.catch{
// エラーのハンドリング
}
使用 asyncHandler
可以使用 Async/Await。
let dataPromise: Promise<Data, Error> = ...
let intPromise: Promise<Int, Never> = ...
let promise = asyncHandler { await in
// promiseのawait
let data = try await | dataPromise
// FailureがNeverの場合はtryはいらない
let int = await | intPromise
return "Hello World"
}
// 返り値をOutput、投げられた例外をFailureとするPromiseになる
Promise 通常在执行它的队列中执行。
如果想在其他队列中执行,可以使用 async
。
Promise.async{ resolve, reject in
// 重い処理
...
resolve(result)
}
.receive(on: .main) // メインスレッドで受け取る
.sink{ ... } // 実行処理
组合 2 个或更多 Promise,如果全部成功,则以元组形式返回 Output。
let promise1 = Promise(...)
let promise2 = Promise(...)
promise1.combine(promise2)
.sink{ ... } // 実行処理
组合 Promise 数组,如果全部成功,则以数组形式返回 Output。
let promises = [Promise](...)
promises.combine()
.sink{ ... } // 実行処理