軽量かつシンプルな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)
}-
mapOutputをクロージャで変換します。
-
flatMapクロージャの返り値のPromiseと連結します。
-
tryMapthrowsなクロージャを実行して失敗した場合は以降のPromiseを失敗にします。
-
tryFlatMapthrowsなクロージャを実行して失敗した場合は以降のPromiseを失敗にします。
-
mapErrorFailureをクロージャで変換します。
-
replaceErrorFailureを引数のOutputで置き換えます。
-
eraseToErrorFailureの型をErrorに変換します。
-
eraseToVoidOutputの方をVoidに変換します。
-
peekOutputの場合にクロージャを実行します。以降にOperatorを接続することができます。
-
peekErrorFailureの場合にクロージャを実行します。以降にOperatorを接続することができます。
-
sinkOutputの場合にクロージャを実行します。以降にOperatorを接続することができません。
-
catchFailureの場合にクロージャを実行します。以降にOperatorを接続することができません。
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は通常は実行したQueueで実行されます。
別のQueueで実行したい場合は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{ ... } // 実行処理