Thenable
public protocol Thenable : AnyObject
Thenable represents an asynchronous operation that can be chained.
-
The type of the wrapped value
Declaration
Swift
associatedtype T -
then(on:Extension methodflags: _: ) The provided closure executes when this promise is fulfilled.
This allows chaining promises. The promise returned by the provided closure is resolved before the promise returned by this closure resolves.
Declaration
Parameters
onThe queue to which the provided closure dispatches.
bodyThe closure that executes when this promise is fulfilled. It must return a promise.
Return Value
A new promise that resolves when the promise returned from the provided closure resolves. For example:
firstly { URLSession.shared.dataTask(.promise, with: url1) }.then { response in transform(data: response.data) }.done { transformation in //… }
-
map(on:Extension methodflags: _: ) The provided closure is executed when this promise is fulfilled.
This is like
thenbut it requires the closure to return a non-promise.Declaration
Parameters
onThe queue to which the provided closure dispatches.
transformThe closure that is executed when this Promise is fulfilled. It must return a non-promise.
Return Value
A new promise that is fulfilled with the value returned from the provided closure or rejected if the provided closure throws. For example:
firstly { URLSession.shared.dataTask(.promise, with: url1) }.map { response in response.data.length }.done { length in //… }
-
map(on:Extension methodflags: _: ) Similar to func
map<U>(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ transform: @escaping(T) throws -> U) -> Promise<U>, but accepts a key path instead of a closure.Declaration
Parameters
onThe queue to which the provided key path for value dispatches.
keyPathThe key path to the value that is using when this Promise is fulfilled.
Return Value
A new promise that is fulfilled with the value for the provided key path.
-
compactMap(on:Extension methodflags: _: ) The provided closure is executed when this promise is fulfilled.
In your closure return an
Optional, if you returnnilthe resulting promise is rejected withPMKError.compactMap, otherwise the promise is fulfilled with the unwrapped value.firstly { URLSession.shared.dataTask(.promise, with: url) }.compactMap { try JSONSerialization.jsonObject(with: $0.data) as? [String: String] }.done { dictionary in //… }.catch { // either `PMKError.compactMap` or a `JSONError` } -
compactMap(on:Extension methodflags: _: ) Similar to func
compactMap<U>(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ transform: @escaping(T) throws -> U?) -> Promise<U>, but accepts a key path instead of a closure.Declaration
Parameters
onThe queue to which the provided key path for value dispatches.
keyPathThe key path to the value that is using when this Promise is fulfilled. If the value for
keyPathisnilthe resulting promise is rejected withPMKError.compactMap.Return Value
A new promise that is fulfilled with the value for the provided key path.
-
done(on:Extension methodflags: _: ) The provided closure is executed when this promise is fulfilled.
Equivalent to
map { x -> Void in, but since we force theVoidreturn Swift is happier and gives you less hassle about your closure’s qualification.Declaration
Parameters
onThe queue to which the provided closure dispatches.
bodyThe closure that is executed when this Promise is fulfilled.
Return Value
A new promise fulfilled as
Voidor rejected if the provided closure throws.firstly { URLSession.shared.dataTask(.promise, with: url) }.done { response in print(response.data) }
-
get(on:Extension methodflags: _: ) The provided closure is executed when this promise is fulfilled.
This is like
donebut it returns the same value that the handler is fed.getimmutably accesses the fulfilled value; the returned Promise maintains that value.Declaration
Parameters
onThe queue to which the provided closure dispatches.
bodyThe closure that is executed when this Promise is fulfilled.
Return Value
A new promise that is fulfilled with the value that the handler is fed or rejected if the provided closure throws. For example:
firstly { .value(1) }.get { foo in print(foo, “ is 1”) }.done { foo in print(foo, “ is 1”) }.done { foo in print(foo, “ is Void”) }
-
tap(on:Extension methodflags: _: ) The provided closure is executed with promise result.
This is like
getbut provides the Resultof the Promise so you can inspect the value of the chain at this point without causing any side effects. promise.tap{ print($0) }.then{ /*…
Declaration
Parameters
onThe queue to which the provided closure dispatches.
bodyThe closure that is executed with Result of Promise.
Return Value
A new promise that is resolved with the result that the handler is fed. For example:
-
asVoid()Extension methodDeclaration
Swift
func asVoid() -> Promise<Void>Return Value
a new promise chained off this promise but with its value discarded.
-
errorExtension methodDeclaration
Swift
var error: Error? { get }Return Value
The error with which this promise was rejected;
nilif this promise is not rejected. -
isPendingExtension methodDeclaration
Swift
var isPending: Bool { get }Return Value
trueif the promise has not yet resolved. -
isResolvedExtension methodDeclaration
Swift
var isResolved: Bool { get }Return Value
trueif the promise has resolved. -
isFulfilledExtension methodDeclaration
Swift
var isFulfilled: Bool { get }Return Value
trueif the promise was fulfilled. -
isRejectedExtension methodDeclaration
Swift
var isRejected: Bool { get }Return Value
trueif the promise was rejected. -
valueExtension methodDeclaration
Swift
var value: T? { get }Return Value
The value with which this promise was fulfilled or
nilif this promise is pending or rejected.
-
filter(on:Extension methodtest: )
-
sorted(on:Extension method)
-
mapValues(on:Extension methodflags: _: ) Promise<[T]>=>T->U=>Promise<[U]>firstly { .value([1,2,3]) }.mapValues { integer in integer * 2 }.done { // $0 => [2,4,6] } -
mapValues(on:Extension methodflags: _: ) Promise<[T]>=>KeyPath<T, U>=>Promise<[U]>firstly { .value([Person(name: "Max"), Person(name: "Roman"), Person(name: "John")]) }.mapValues(\.name).done { // $0 => ["Max", "Roman", "John"] } -
flatMapValues(on:Extension methodflags: _: ) Promise<[T]>=>T->[U]=>Promise<[U]>firstly { .value([1,2,3]) }.flatMapValues { integer in [integer, integer] }.done { // $0 => [1,1,2,2,3,3] } -
compactMapValues(on:Extension methodflags: _: ) Promise<[T]>=>T->U?=>Promise<[U]>firstly { .value(["1","2","a","3"]) }.compactMapValues { Int($0) }.done { // $0 => [1,2,3] } -
compactMapValues(on:Extension methodflags: _: ) Promise<[T]>=>KeyPath<T, U?>=>Promise<[U]>firstly { .value([Person(name: "Max"), Person(name: "Roman", age: 26), Person(name: "John", age: 23)]) }.compactMapValues(\.age).done { // $0 => [26, 23] } -
thenMap(on:Extension methodflags: _: ) Promise<[T]>=>T->Promise<U>=>Promise<[U]>firstly { .value([1,2,3]) }.thenMap { integer in .value(integer * 2) }.done { // $0 => [2,4,6] } -
thenFlatMap(on:Extension methodflags: _: ) Promise<[T]>=>T->Promise<[U]>=>Promise<[U]>firstly { .value([1,2,3]) }.thenFlatMap { integer in .value([integer, integer]) }.done { // $0 => [1,1,2,2,3,3] } -
filterValues(on:Extension methodflags: _: ) Promise<[T]>=>T-> Bool =>Promise<[T]>firstly { .value([1,2,3]) }.filterValues { $0 > 1 }.done { // $0 => [2,3] } -
filterValues(on:Extension methodflags: _: ) Promise<[T]>=>KeyPath<T, Bool>=>Promise<[T]>firstly { .value([Person(name: "Max"), Person(name: "Roman", age: 26, isStudent: false), Person(name: "John", age: 23, isStudent: true)]) }.filterValues(\.isStudent).done { // $0 => [Person(name: "John", age: 23, isStudent: true)] }
-
firstValueExtension method -
firstValue(on:Extension methodflags: where: ) -
lastValueExtension method
-
sortedValues(on:Extension methodflags: )
View on GitHub