Skip to content

kseebaldt/deferred

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 
 
 
 
 
 
 
 
 

Async library inspired by CommonJS Promises/A spec Build Status Carthage compatible

http://wiki.commonjs.org/wiki/Promises/A

Installation

Via CocoaPods:

pod 'KSDeferred'

Examples

Creating a promise

	[KSPromise promise:^(resolveType resolve, rejectType reject) {
        [obj doAsyncThing:^(id value, NSError *error) {
			if (error) {
				reject(error);
			} else {
				resolve(value);
			}
		}];
    }];

Creating a resolved promise

    KSPromise<NSString *> *promise = [KSPromise resolve:@"A"];

Creating a rejected promise

    KSPromise<NSString *> *promise = [KSPromise reject:[NSError errorWithDomain:@"error" code:1 userInfo:nil]];

Adding callback to the promise

    [promise then:^id(id value) {
        .. do something ..
        return value;
      } error:^id(NSError *e) {
        .. handle error ..
        return e;
    }];

Shortcut methods when only one callback is needed

    [promise then:^id(id value) {
        .. do something ..
        return value;
    }];

    [promise error:^id(NSError error) {
        .. do something ..
        return error;
    }];

Chaining promises

    KSPromise *step1 = [KSPromise promise:^(resolveType resolve, rejectType reject) {
        [obj doAsyncThing:^(id value, NSError *error) {
			if (error) {
				reject(error);
			} else {
				resolve(value);
			}
		}];
    }];

    KSPromise *step2 = [step1 then:^id(id value) {
        # value is value returned from first promise
		return [obj doSomethingWith:value];
    } error:^id(NSError *e) {
        # error is error returned from first promise
		return e;
    }];

Always execute a callback, regardless of fulfillment or rejection

    [promise finally:^ {
        .. do something ..
    }];

Returning a promise from a callback to chain async work

    KSPromise *chained = [promise then:^id(id value) {
		KSPromise promise = [obj doAsyncThing];
		return promise;
    } error:^id(NSError *e) {
        return e;
    }];

    [chained then:^id(id value) {
        # value is value from doAsyncThing
    } error:^id(NSError *e) {
        # error is error from doAsyncThing
    }];

Returning a promise that completes after an array of other promises have completed

    KSPromise *waitForMe1 = ...;
    KSPromise *waitForMe2 = ...;
    
    KSPromise *joinedPromise = [KSPromise when: @[
        waitForMe1, waitForMe2
    ]];

The method all: is a synonym for when:.

Working with generics for improved type safety (Xcode 7 and higher)

    KSPromise<NSDate *> *promise = [KSPromise promise:^(resolveType resolve, rejectType reject) {
        [obj doAsyncThing:^(id value, NSError *error) {
			resolve([NSDate date]);
		}];
    }];

    [promise then:^id(NSDate *date) {
        .. do something ..
        return date;
    } error:^id(NSError *e) {
        .. handle error ..
        return e;
    }];

Author

Copyright (c) 2013-2016 Kurtis Seebaldt. This software is licensed under the MIT License.