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
on
The queue to which the provided closure dispatches.
body
The 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
then
but it requires the closure to return a non-promise.Declaration
Parameters
on
The queue to which the provided closure dispatches.
transform
The 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
on
The queue to which the provided key path for value dispatches.
keyPath
The 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 returnnil
the 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
on
The queue to which the provided key path for value dispatches.
keyPath
The key path to the value that is using when this Promise is fulfilled. If the value for
keyPath
isnil
the 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 theVoid
return Swift is happier and gives you less hassle about your closure’s qualification.Declaration
Parameters
on
The queue to which the provided closure dispatches.
body
The closure that is executed when this Promise is fulfilled.
Return Value
A new promise fulfilled as
Void
or 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
done
but it returns the same value that the handler is fed.get
immutably accesses the fulfilled value; the returned Promise maintains that value.Declaration
Parameters
on
The queue to which the provided closure dispatches.
body
The 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
get
but 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
on
The queue to which the provided closure dispatches.
body
The 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.
-
error
Extension methodDeclaration
Swift
var error: Error? { get }
Return Value
The error with which this promise was rejected;
nil
if this promise is not rejected. -
isPending
Extension methodDeclaration
Swift
var isPending: Bool { get }
Return Value
true
if the promise has not yet resolved. -
isResolved
Extension methodDeclaration
Swift
var isResolved: Bool { get }
Return Value
true
if the promise has resolved. -
isFulfilled
Extension methodDeclaration
Swift
var isFulfilled: Bool { get }
Return Value
true
if the promise was fulfilled. -
isRejected
Extension methodDeclaration
Swift
var isRejected: Bool { get }
Return Value
true
if the promise was rejected. -
value
Extension methodDeclaration
Swift
var value: T? { get }
Return Value
The value with which this promise was fulfilled or
nil
if 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)] }
-
firstValue
Extension method -
firstValue(on:
Extension methodflags: where: ) -
lastValue
Extension method
-
sortedValues(on:
Extension methodflags: )