Skip to content

Instantly share code, notes, and snippets.

@EfraimB
Created January 8, 2018 14:22
Show Gist options
  • Save EfraimB/918eebdf7dd020801c72da1289c8d797 to your computer and use it in GitHub Desktop.
Save EfraimB/918eebdf7dd020801c72da1289c8d797 to your computer and use it in GitHub Desktop.
class PromiseCancelledError: CancellableError {
var isCancelled: Bool {
return true
}
}
public class CancelablePromise<T> {
var promise:Promise<T>
var cancellable:TTCancellable!
var reject:((Error) -> Void)!
init(resolvers: (_ fulfill: @escaping (T) -> Void, _ reject: @escaping (Error) -> Void) throws -> Void, cancellable:TTCancellable) {
var _reject:((Error) -> Void)!
self.promise = Promise<T> { (fulfill, reject) in
_reject = reject
try? resolvers(fulfill,reject)
}
self.reject = _reject
self.cancellable = cancellable
}
init(promise:Promise<T>, cancellable:TTCancellable ) {
self.promise = promise
self.cancellable = cancellable
}
public func cancel() {
guard promise.isPending else {
return
}
reject(PromiseCancelledError())
cancellable.cancel()
}
var value:T? {
return promise.value
}
@discardableResult
public func then<U>(on q: DispatchQueue = .default, execute body: @escaping (T) throws -> U) -> Promise<U> {
return promise.then(on: q, execute: body)
}
@discardableResult
public func then<U>(on q: DispatchQueue = .default, execute body: @escaping (T) throws -> Promise<U>) -> Promise<U> {
return promise.then(on: q, execute: body)
}
@discardableResult
public func `catch`(on q: DispatchQueue = .default, policy: CatchPolicy = .allErrorsExceptCancellation, execute body: @escaping (Error) -> Void) -> Promise<T> {
return promise.catch(on: q, policy: policy, execute: body)
}
public func `catch`(on q: DispatchQueue = .default, policy: CatchPolicy = .allErrorsExceptCancellation, execute body: @escaping (Error) -> Void) {
_ = promise.catch(on: q, policy: policy, execute: body)
}
@discardableResult
public func recover(on q: DispatchQueue = .default, policy: CatchPolicy = .allErrorsExceptCancellation, execute body: @escaping (Error) throws -> Promise<T>) -> Promise<T> {
return promise.recover(on: q, policy: policy, execute: body)
}
@discardableResult
public func recover(on q: DispatchQueue = .default, policy: CatchPolicy = .allErrorsExceptCancellation, execute body: @escaping (Error) throws -> T) -> Promise<T> {
return promise.recover(on: q, policy: policy, execute: body)
}
}
@AntonNix
Copy link

AntonNix commented Jul 2, 2018

Great thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment