src/cm/media/js/lib/yui/yui3-3.15.0/build/promise/promise.js
author gibus
Mon, 10 Mar 2014 15:19:48 +0100
changeset 602 e16a97fb364a
permissions -rw-r--r--
Use YUI 3.15
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     1
YUI.add('promise', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     3
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     4
Wraps the execution of asynchronous operations, providing a promise object that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
can be used to subscribe to the various ways the operation may terminate.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
When the operation completes successfully, call the Resolver's `resolve()`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
method, passing any relevant response data for subscribers.  If the operation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
encounters an error or is unsuccessful in some way, call `reject()`, again
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
passing any relevant data for subscribers.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
The Resolver object should be shared only with the code resposible for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
resolving or rejecting it. Public access for the Resolver is through its
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
_promise_, which is returned from the Resolver's `promise` property. While both
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
Resolver and promise allow subscriptions to the Resolver's state changes, the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
promise may be exposed to non-controlling code. It is the preferable interface
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
for adding subscriptions.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
Subscribe to state changes in the Resolver with the promise's
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
`then(callback, errback)` method.  `then()` wraps the passed callbacks in a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
new Resolver and returns the corresponding promise, allowing chaining of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
asynchronous or synchronous operations. E.g.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
`promise.then(someAsyncFunc).then(anotherAsyncFunc)`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
@module promise
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
@since 3.9.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
var Lang  = Y.Lang,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
    slice = [].slice;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
A promise represents a value that may not yet be available. Promises allow
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
you to chain asynchronous operations, write synchronous looking code and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
handle errors throughout the process.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
This constructor takes a function as a parameter where you can insert the logic
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
that fulfills or rejects this promise. The fulfillment value and the rejection
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
reason can be any JavaScript value. It's encouraged that rejection reasons be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
error objects
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
<pre><code>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
var fulfilled = new Y.Promise(function (resolve) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
    resolve('I am a fulfilled promise');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
var rejected = new Y.Promise(function (resolve, reject) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
    reject(new Error('I am a rejected promise'));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
</code></pre>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
@class Promise
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
@constructor
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
@param {Function} fn A function where to insert the logic that resolves this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
        promise. Receives `resolve` and `reject` functions as parameters.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
        This function is called synchronously.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
function Promise(fn) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
    if (!(this instanceof Promise)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
        return new Promise(fn);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
    var resolver = new Promise.Resolver(this);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
    A reference to the resolver object that handles this promise
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
    @property _resolver
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
    @type Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
    this._resolver = resolver;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
    fn.call(this, function (value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
        resolver.resolve(value);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
    }, function (reason) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
        resolver.reject(reason);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
Y.mix(Promise.prototype, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
    Schedule execution of a callback to either or both of "fulfill" and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
    "reject" resolutions for this promise. The callbacks are wrapped in a new
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
    promise and that promise is returned.  This allows operation chaining ala
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
    `functionA().then(functionB).then(functionC)` where `functionA` returns
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
    a promise, and `functionB` and `functionC` _may_ return promises.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
    Asynchronicity of the callbacks is guaranteed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
    @method then
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
    @param {Function} [callback] function to execute if the promise
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
                resolves successfully
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
    @param {Function} [errback] function to execute if the promise
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
                resolves unsuccessfully
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
    @return {Promise} A promise wrapping the resolution of either "resolve" or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
                "reject" callback
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
    then: function (callback, errback) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
        var Constructor = this.constructor,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
            resolver = this._resolver;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
        // using this.constructor allows for customized promises to be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
        // returned instead of plain ones
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
        return new Constructor(function (resolve, reject) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
            resolver._addCallbacks(
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
                // Check if callbacks are functions. If not, default to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
                // `resolve` and `reject` respectively.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
                // The wrapping of the callbacks is done here and not in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
                // `_addCallbacks` because it is a feature specific to  `then`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
                // If `done` is added to promises it would call `_addCallbacks`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
                // without defaulting to anything and without wrapping
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
                typeof callback === 'function' ?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
                    Promise._wrap(resolve, reject, callback) : resolve,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
                typeof errback === 'function' ?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
                    Promise._wrap(resolve, reject, errback) : reject
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
            );
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
    /*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
    A shorthand for `promise.then(undefined, callback)`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
    Returns a new promise and the error callback gets the same treatment as in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
    `then`: errors get caught and turned into rejections, and the return value
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
    of the callback becomes the fulfilled value of the returned promise.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
    @method catch
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
    @param [Function] errback Callback to be called in case this promise is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
                        rejected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
    @return {Promise} A new promise modified by the behavior of the error
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
                        callback
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
    'catch': function (errback) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
        return this.then(undefined, errback);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
    Returns the current status of the operation. Possible results are
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
    "pending", "fulfilled", and "rejected".
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
    @method getStatus
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
    @return {String}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
    @deprecated
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
    getStatus: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
        return this._resolver.getStatus();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
Wraps the callback in another function to catch exceptions and turn them into
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
rejections.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
@method _wrap
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
@param {Function} resolve Resolving function of the resolver that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
                    handles this promise
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
@param {Function} reject Rejection function of the resolver that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
                    handles this promise
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
@param {Function} fn Callback to wrap
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
@return {Function}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
@private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
Promise._wrap = function (resolve, reject, fn) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
    // callbacks and errbacks only get one argument
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
    return function (valueOrReason) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
        var result;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
        // Promises model exception handling through callbacks
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
        // making both synchronous and asynchronous errors behave
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
        // the same way
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
        try {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
            // Use the argument coming in to the callback/errback from the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
            // resolution of the parent promise.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
            // The function must be called as a normal function, with no
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
            // special value for |this|, as per Promises A+
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   177
            result = fn(valueOrReason);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   178
        } catch (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   179
            reject(e);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   183
        resolve(result);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   184
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   185
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   186
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   187
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   188
Checks if an object or value is a promise. This is cross-implementation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   189
compatible, so promises returned from other libraries or native components
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   190
that are compatible with the Promises A+ spec should be recognized by this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   191
method.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   192
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   193
@method isPromise
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   194
@param {Any} obj The object to test
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   195
@return {Boolean} Whether the object is a promise or not
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   196
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   197
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   198
Promise.isPromise = function (obj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   199
    var then;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   200
    // We test promises by structure to be able to identify other
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   201
    // implementations' promises. This is important for cross compatibility and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   202
    // In particular Y.when which should recognize any kind of promise
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   203
    // Use try...catch when retrieving obj.then. Return false if it throws
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   204
    // See Promises/A+ 1.1
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   205
    try {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   206
        then = obj.then;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   207
    } catch (_) {}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   208
    return typeof then === 'function';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   209
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   210
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   211
/*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   212
Ensures that a certain value is a promise. If it is not a promise, it wraps it
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   213
in one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   214
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   215
This method can be copied or inherited in subclasses. In that case it will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   216
check that the value passed to it is an instance of the correct class.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   217
This means that `PromiseSubclass.resolve()` will always return instances of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   218
`PromiseSubclass`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   219
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   220
@method resolve
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   221
@param {Any} Any object that may or may not be a promise
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   222
@return {Promise}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   223
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   224
*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   225
Promise.resolve = function (value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   226
    return Promise.isPromise(value) && value.constructor === this ? value :
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   227
        /*jshint newcap: false */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   228
        new this(function (resolve) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   229
        /*jshint newcap: true */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   230
            resolve(value);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   231
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   232
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   233
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   234
/*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   235
A shorthand for creating a rejected promise.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   236
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   237
@method reject
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   238
@param {Any} reason Reason for the rejection of this promise. Usually an Error
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   239
    Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   240
@return {Promise} A rejected promise
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   241
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   242
*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   243
Promise.reject = function (reason) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   244
    /*jshint newcap: false */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   245
    return new this(function (resolve, reject) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   246
    /*jshint newcap: true */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   247
        reject(reason);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   248
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   249
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   250
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   251
/*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   252
Returns a promise that is resolved or rejected when all values are resolved or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   253
any is rejected. This is useful for waiting for the resolution of multiple
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   254
promises, such as reading multiple files in Node.js or making multiple XHR
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   255
requests in the browser.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   256
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   257
@method all
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   258
@param {Any[]} values An array of any kind of values, promises or not. If a value is not
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   259
@return [Promise] A promise for an array of all the fulfillment values
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   260
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   261
*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   262
Promise.all = function (values) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   263
    var Promise = this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   264
    return new Promise(function (resolve, reject) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   265
        if (!Lang.isArray(values)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   266
            reject(new TypeError('Promise.all expects an array of values or promises'));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   267
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   268
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   269
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   270
        var remaining = values.length,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   271
            i         = 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   272
            length    = values.length,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   273
            results   = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   274
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   275
        function oneDone(index) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   276
            return function (value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   277
                results[index] = value;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   278
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   279
                remaining--;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   280
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   281
                if (!remaining) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   282
                    resolve(results);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   283
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   284
            };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   285
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   286
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   287
        if (length < 1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   288
            return resolve(results);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   289
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   290
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   291
        for (; i < length; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   292
            Promise.resolve(values[i]).then(oneDone(i), reject);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   293
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   294
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   295
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   296
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   297
/*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   298
Returns a promise that is resolved or rejected when any of values is either
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   299
resolved or rejected. Can be used for providing early feedback in the UI
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   300
while other operations are still pending.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   301
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   302
@method race
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   303
@param {Any[]} values An array of values or promises
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   304
@return {Promise}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   305
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   306
*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   307
Promise.race = function (values) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   308
    var Promise = this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   309
    return new Promise(function (resolve, reject) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   310
        if (!Lang.isArray(values)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   311
            reject(new TypeError('Promise.race expects an array of values or promises'));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   312
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   313
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   314
        
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   315
        // just go through the list and resolve and reject at the first change
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   316
        // This abuses the fact that calling resolve/reject multiple times
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   317
        // doesn't change the state of the returned promise
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   318
        for (var i = 0, count = values.length; i < count; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   319
            Promise.resolve(values[i]).then(resolve, reject);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   320
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   321
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   322
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   323
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   324
Y.Promise = Promise;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   325
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   326
Represents an asynchronous operation. Provides a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   327
standard API for subscribing to the moment that the operation completes either
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   328
successfully (`fulfill()`) or unsuccessfully (`reject()`).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   329
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   330
@class Promise.Resolver
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   331
@constructor
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   332
@param {Promise} promise The promise instance this resolver will be handling
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   333
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   334
function Resolver(promise) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   335
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   336
    List of success callbacks
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   337
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   338
    @property _callbacks
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   339
    @type Array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   340
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   341
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   342
    this._callbacks = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   343
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   344
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   345
    List of failure callbacks
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   346
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   347
    @property _errbacks
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   348
    @type Array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   349
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   350
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   351
    this._errbacks = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   352
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   353
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   354
    The promise for this Resolver.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   355
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   356
    @property promise
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   357
    @type Promise
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   358
    @deprecated
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   359
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   360
    this.promise = promise;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   361
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   362
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   363
    The status of the operation. This property may take only one of the following
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   364
    values: 'pending', 'fulfilled' or 'rejected'.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   365
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   366
    @property _status
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   367
    @type String
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   368
    @default 'pending'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   369
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   370
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   371
    this._status = 'pending';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   372
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   373
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   374
    This value that this promise represents.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   375
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   376
    @property _result
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   377
    @type Any
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   378
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   379
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   380
    this._result = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   381
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   382
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   383
Y.mix(Resolver.prototype, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   384
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   385
    Resolves the promise, signaling successful completion of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   386
    represented operation. All "onFulfilled" subscriptions are executed and passed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   387
    the value provided to this method. After calling `fulfill()`, `reject()` and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   388
    `notify()` are disabled.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   389
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   390
    @method fulfill
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   391
    @param {Any} value Value to pass along to the "onFulfilled" subscribers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   392
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   393
    fulfill: function (value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   394
        if (this._status === 'pending') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   395
            this._result = value;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   396
            this._status = 'fulfilled';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   397
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   398
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   399
        if (this._status === 'fulfilled') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   400
            this._notify(this._callbacks, this._result);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   401
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   402
            // Reset the callback list so that future calls to fulfill()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   403
            // won't call the same callbacks again. Promises keep a list
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   404
            // of callbacks, they're not the same as events. In practice,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   405
            // calls to fulfill() after the first one should not be made by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   406
            // the user but by then()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   407
            this._callbacks = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   408
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   409
            // Once a promise gets fulfilled it can't be rejected, so
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   410
            // there is no point in keeping the list. Remove it to help
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   411
            // garbage collection
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   412
            this._errbacks = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   413
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   414
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   415
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   416
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   417
    Resolves the promise, signaling *un*successful completion of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   418
    represented operation. All "onRejected" subscriptions are executed with
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   419
    the value provided to this method. After calling `reject()`, `resolve()`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   420
    and `notify()` are disabled.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   421
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   422
    @method reject
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   423
    @param {Any} value Value to pass along to the "reject" subscribers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   424
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   425
    reject: function (reason) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   426
        if (this._status === 'pending') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   427
            this._result = reason;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   428
            this._status = 'rejected';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   429
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   430
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   431
        if (this._status === 'rejected') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   432
            this._notify(this._errbacks, this._result);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   433
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   434
            // See fulfill()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   435
            this._callbacks = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   436
            this._errbacks = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   437
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   438
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   439
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   440
    /*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   441
    Given a certain value A passed as a parameter, this method resolves the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   442
    promise to the value A.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   443
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   444
    If A is a promise, `resolve` will cause the resolver to adopt the state of A
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   445
    and once A is resolved, it will resolve the resolver's promise as well.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   446
    This behavior "flattens" A by calling `then` recursively and essentially
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   447
    disallows promises-for-promises.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   448
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   449
    This is the default algorithm used when using the function passed as the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   450
    first argument to the promise initialization function. This means that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   451
    the following code returns a promise for the value 'hello world':
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   452
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   453
        var promise1 = new Y.Promise(function (resolve) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   454
            resolve('hello world');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   455
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   456
        var promise2 = new Y.Promise(function (resolve) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   457
            resolve(promise1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   458
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   459
        promise2.then(function (value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   460
            assert(value === 'hello world'); // true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   461
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   462
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   463
    @method resolve
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   464
    @param [Any] value A regular JS value or a promise
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   465
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   466
    resolve: function (value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   467
        var self = this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   468
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   469
        if (Promise.isPromise(value)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   470
            value.then(function (value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   471
                self.resolve(value);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   472
            }, function (reason) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   473
                self.reject(reason);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   474
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   475
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   476
            this.fulfill(value);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   477
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   478
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   479
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   480
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   481
    Schedule execution of a callback to either or both of "resolve" and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   482
    "reject" resolutions for the Resolver.  The callbacks
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   483
    are wrapped in a new Resolver and that Resolver's corresponding promise
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   484
    is returned.  This allows operation chaining ala
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   485
    `functionA().then(functionB).then(functionC)` where `functionA` returns
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   486
    a promise, and `functionB` and `functionC` _may_ return promises.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   487
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   488
    @method then
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   489
    @param {Function} [callback] function to execute if the Resolver
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   490
                resolves successfully
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   491
    @param {Function} [errback] function to execute if the Resolver
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   492
                resolves unsuccessfully
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   493
    @return {Promise} The promise of a new Resolver wrapping the resolution
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   494
                of either "resolve" or "reject" callback
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   495
    @deprecated
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   496
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   497
    then: function (callback, errback) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   498
        return this.promise.then(callback, errback);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   499
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   500
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   501
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   502
    Schedule execution of a callback to either or both of "resolve" and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   503
    "reject" resolutions of this resolver. If the resolver is not pending,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   504
    the correct callback gets called automatically.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   505
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   506
    @method _addCallbacks
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   507
    @param {Function} [callback] function to execute if the Resolver
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   508
                resolves successfully
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   509
    @param {Function} [errback] function to execute if the Resolver
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   510
                resolves unsuccessfully
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   511
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   512
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   513
    _addCallbacks: function (callback, errback) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   514
        var callbackList = this._callbacks,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   515
            errbackList  = this._errbacks,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   516
            status       = this._status,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   517
            result       = this._result;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   518
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   519
        if (callbackList && typeof callback === 'function') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   520
            callbackList.push(callback);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   521
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   522
        if (errbackList && typeof errback === 'function') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   523
            errbackList.push(errback);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   524
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   525
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   526
        // If a promise is already fulfilled or rejected, notify the newly added
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   527
        // callbacks by calling fulfill() or reject()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   528
        if (status === 'fulfilled') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   529
            this.fulfill(result);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   530
        } else if (status === 'rejected') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   531
            this.reject(result);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   532
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   533
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   534
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   535
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   536
    Returns the current status of the Resolver as a string "pending",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   537
    "fulfilled", or "rejected".
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   538
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   539
    @method getStatus
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   540
    @return {String}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   541
    @deprecated
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   542
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   543
    getStatus: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   544
        return this._status;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   545
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   546
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   547
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   548
    Executes an array of callbacks from a specified context, passing a set of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   549
    arguments.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   550
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   551
    @method _notify
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   552
    @param {Function[]} subs The array of subscriber callbacks
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   553
    @param {Any} result Value to pass the callbacks
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   554
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   555
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   556
    _notify: function (subs, result) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   557
        // Since callback lists are reset synchronously, the subs list never
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   558
        // changes after _notify() receives it. Avoid calling Y.soon() for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   559
        // an empty list
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   560
        if (subs.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   561
            // Calling all callbacks after Y.soon to guarantee
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   562
            // asynchronicity. Because setTimeout can cause unnecessary
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   563
            // delays that *can* become noticeable in some situations
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   564
            // (especially in Node.js)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   565
            Y.soon(function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   566
                var i, len;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   567
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   568
                for (i = 0, len = subs.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   569
                    subs[i](result);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   570
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   571
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   572
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   573
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   574
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   575
}, true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   576
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   577
Y.Promise.Resolver = Resolver;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   578
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   579
Abstraction API allowing you to interact with promises or raw values as if they
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   580
were promises. If a non-promise object is passed in, a new Resolver is created
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   581
and scheduled to resolve asynchronously with the provided value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   582
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   583
In either case, a promise is returned.  If either _callback_ or _errback_ are
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   584
provided, the promise returned is the one returned from calling
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   585
`promise.then(callback, errback)` on the provided or created promise.  If neither
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   586
are provided, the original promise is returned.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   587
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   588
@for YUI
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   589
@method when
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   590
@param {Any} promise Promise object or value to wrap in a resolved promise
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   591
@param {Function} [callback] callback to execute if the promise is resolved
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   592
@param {Function} [errback] callback to execute if the promise is rejected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   593
@return {Promise}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   594
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   595
Y.when = function (promise, callback, errback) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   596
    promise = Promise.resolve(promise);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   597
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   598
    return (callback || errback) ? promise.then(callback, errback) : promise;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   599
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   600
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   601
Returns a new promise that will be resolved when all operations have completed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   602
Takes both any numer of values as arguments. If an argument is a not a promise,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   603
it will be wrapped in a new promise, same as in `Y.when()`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   604
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   605
@for YUI
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   606
@method batch
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   607
@param {Any} operation* Any number of Y.Promise objects or regular JS values
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   608
@return {Promise} Promise to be fulfilled when all provided promises are
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   609
                    resolved
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   610
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   611
Y.batch = function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   612
    return Promise.all(slice.call(arguments));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   613
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   614
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   615
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   616
}, '@VERSION@', {"requires": ["timers"]});